1CTAGS-LANG-ELM(7) Universal Ctags CTAGS-LANG-ELM(7)
2
3
4
6 ctags-lang-elm - Random notes about tagging Elm source code with Uni‐
7 versal Ctags
8
10 ctags ... --languages=+Elm ...
11 ctags ... --language-force=Elm ...
12 ctags ... --map-Elm=+.elm ...
13
14
16 The Elm parser is a PEG parser using PackCC, which is part of the ctags
17 infrastructure. It should correctly process all top level statements,
18 however there is a limitation with functions embedded in let/in blocks.
19 They will mostly be fine, but sometimes a function in a let/in block
20 will be omitted.
21
23 Imports
24 Imported modules are tagged, and their role is "imported", not "def".
25 Types, functions, etc which are exposed via imported module have their
26 role as "exposed".
27
28 Exposed items are marked as being in the scope of their own module, not
29 the module that's doing the importing.
30
31 "input.elm"
32
33 module SomeMod exposing (..)
34
35 import MyMod exposing
36 ( map
37 , Maybe
38 , Result(..)
39 , MyList(Empty)
40 )
41
42 "output.tags" with "--options=NONE -o - --sort=no --extras=+r
43 --fields=+r input.elm"
44
45 SomeMod input.elm /^module SomeMod exposing (..)$/;" m roles:def
46 MyMod input.elm /^import MyMod exposing$/;" m roles:imported
47 map input.elm /^ ( map$/;" f module:MyMod roles:exposed
48 Maybe input.elm /^ , Maybe$/;" t module:MyMod roles:exposed
49 Result input.elm /^ , Result(..)$/;" t module:MyMod roles:exposed
50 MyList input.elm /^ , MyList(Empty)$/;" t module:MyMod roles:exposed
51 Empty input.elm /^ , MyList(Empty)$/;" c type:MyMod.MyList roles:exposed
52
53 Namespaces
54 Namespaces are tagged and their role is "def".
55
56 "input.elm"
57
58 module AMod exposing (..)
59
60 import MyImport as NSpace exposing (impFunc)
61
62 "output.tags" with "--options=NONE -o - --sort=no --extras=+r
63 --fields=+r input.elm"
64
65 AMod input.elm /^module AMod exposing (..)$/;" m roles:def
66 NSpace input.elm /^import MyImport as NSpace exposing (impFunc)$/;" n module:AMod roles:def moduleName:MyImport
67 MyImport input.elm /^import MyImport as NSpace exposing (impFunc)$/;" m roles:imported
68 impFunc input.elm /^import MyImport as NSpace exposing (impFunc)$/;" f module:MyImport roles:exposed
69
70 Type names
71 Constructors top level functions will have type names.
72
73 "input.elm"
74
75 funcA : Int -> Int
76 funcA a = a + 1
77
78 type B
79 = B1Cons
80 { x : Float
81 , y : Float
82 }
83 | B2Cons String Integer
84 | B3Cons
85
86 "output.tags" with "--options=NONE -o - --sort=no --extras=+r
87 --fields=+r input.elm"
88
89 funcA input.elm /^funcA a = a + 1$/;" f typeref:typename:Int -> Int roles:def
90 B input.elm /^type B$/;" t roles:def
91 B1Cons input.elm /^ = B1Cons$/;" c type:B typeref:typename:{ x : Float , y : Float } -> B roles:def
92 B2Cons input.elm /^ | B2Cons String Integer$/;" c type:B typeref:typename:String -> Integer -> B roles:def
93 B3Cons input.elm /^ | B3Cons$/;" c type:B typeref:typename:B roles:def
94
95 Function parameter lists
96 Function parameter lists can be extracted into the tags file signature
97 field. They are not really function signatures, but it's the closest
98 concept available in ctags. Use "--fields=+S".
99
100 funcA a1 a2 =
101 a1 + a2
102
103 "output.tags" with "--sort=no --extras=+r --fields=+rS"
104
105 funcA input.elm /^funcA a1 a2 =$/;" f signature:a1 a2 roles:def
106
108 The ctags signature field is used for function parameter lists, even
109 though it's not an idea field. See above.
110
111 Elm requires all statements at the same logical level to have the same
112 indentation. If there is additional indentation that line is part of
113 the previous one. Therefore without over-complicating the PEG parser we
114 have the following limitations...
115
116 Sometimes functions in let/in blocks will be omitted.
117
118 Functions in let/in blocks will be marked as being in the scope of
119 their outer function, regardless of how deeply nested the let/in block
120 is.
121
122 Functions in let/in blocks won't have type names.
123
125 ctags(1), ctags-client-tools(7)
126
127
128
129
1305.9.0 CTAGS-LANG-ELM(7)