xref: /Universal-ctags/man/ctags-lang-elm.7.rst.in (revision 8959a9c341c8407dbaac292486be96b4f0711d25)
194e964efSNik Silver.. _ctags-lang-elm(7):
294e964efSNik Silver
394e964efSNik Silver==============================================================
494e964efSNik Silverctags-lang-elm
594e964efSNik Silver==============================================================
694e964efSNik Silver-------------------------------------------------------------------
794e964efSNik SilverRandom notes about tagging Elm source code with Universal Ctags
894e964efSNik Silver-------------------------------------------------------------------
994e964efSNik Silver:Version: @VERSION@
1094e964efSNik Silver:Manual group: Universal Ctags
1194e964efSNik Silver:Manual section: 7
1294e964efSNik Silver
1394e964efSNik SilverSYNOPSIS
1494e964efSNik Silver--------
1594e964efSNik Silver|	**@CTAGS_NAME_EXECUTABLE@** ... --languages=+Elm ...
1694e964efSNik Silver|	**@CTAGS_NAME_EXECUTABLE@** ... --language-force=Elm ...
1794e964efSNik Silver|	**@CTAGS_NAME_EXECUTABLE@** ... --map-Elm=+.elm ...
1894e964efSNik Silver
1994e964efSNik SilverDESCRIPTION
2094e964efSNik Silver-----------
2194e964efSNik SilverThe Elm parser is a PEG parser using PackCC, which is part of the
2294e964efSNik Silverctags infrastructure. It should correctly process all top level
2394e964efSNik Silverstatements, however there is a limitation with functions embedded
2494e964efSNik Silverin let/in blocks. They will mostly be fine, but sometimes a
2594e964efSNik Silverfunction in a let/in block will be omitted.
2694e964efSNik Silver
2794e964efSNik SilverEXAMPLES
2894e964efSNik Silver--------
2994e964efSNik Silver
3094e964efSNik SilverImports
3194e964efSNik Silver~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3294e964efSNik Silver
33*8959a9c3SNik SilverImported modules are tagged, and their role is "imported", not "def".
34*8959a9c3SNik SilverTypes, functions, etc which are exposed via imported module have their
35*8959a9c3SNik Silverrole as "exposed".
3694e964efSNik Silver
37*8959a9c3SNik SilverExposed items are marked as being in the scope of their own module,
3894e964efSNik Silvernot the module that's doing the importing.
3994e964efSNik Silver
4094e964efSNik Silver"input.elm"
4194e964efSNik Silver
4294e964efSNik Silver.. code-block:: Elm
4394e964efSNik Silver
4494e964efSNik Silver	module SomeMod exposing (..)
4594e964efSNik Silver
4694e964efSNik Silver	import MyMod exposing
4794e964efSNik Silver	  ( map
4894e964efSNik Silver	  , Maybe
4994e964efSNik Silver	  , Result(..)
5094e964efSNik Silver	  , MyList(Empty)
5194e964efSNik Silver	  )
5294e964efSNik Silver
5394e964efSNik Silver"output.tags"
5494e964efSNik Silverwith "--options=NONE -o - --sort=no --extras=+r --fields=+r input.elm"
5594e964efSNik Silver
5694e964efSNik Silver.. code-block:: tags
5794e964efSNik Silver
5894e964efSNik Silver	SomeMod	input.elm	/^module SomeMod exposing (..)$/;"	m	roles:def
5994e964efSNik Silver	MyMod	input.elm	/^import MyMod exposing$/;"	m	roles:imported
60*8959a9c3SNik Silver	map	input.elm	/^  ( map$/;"	f	module:MyMod	roles:exposed
61*8959a9c3SNik Silver	Maybe	input.elm	/^  , Maybe$/;"	t	module:MyMod	roles:exposed
62*8959a9c3SNik Silver	Result	input.elm	/^  , Result(..)$/;"	t	module:MyMod	roles:exposed
63*8959a9c3SNik Silver	MyList	input.elm	/^  , MyList(Empty)$/;"	t	module:MyMod	roles:exposed
64*8959a9c3SNik Silver	Empty	input.elm	/^  , MyList(Empty)$/;"	c	type:MyMod.MyList	roles:exposed
6594e964efSNik Silver
6694e964efSNik SilverNamespaces
6794e964efSNik Silver~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
6894e964efSNik Silver
6994e964efSNik SilverNamespaces are tagged and their role is "def".
7094e964efSNik Silver
7194e964efSNik Silver"input.elm"
7294e964efSNik Silver
7394e964efSNik Silver.. code-block:: Elm
7494e964efSNik Silver
7594e964efSNik Silver	module AMod exposing (..)
7694e964efSNik Silver
7794e964efSNik Silver	import MyImport as NSpace exposing (impFunc)
7894e964efSNik Silver
7994e964efSNik Silver"output.tags"
8094e964efSNik Silverwith "--options=NONE -o - --sort=no --extras=+r --fields=+r input.elm"
8194e964efSNik Silver
8294e964efSNik Silver.. code-block:: tags
8394e964efSNik Silver
8494e964efSNik Silver	AMod	input.elm	/^module AMod exposing (..)$/;"	m	roles:def
8594e964efSNik Silver	NSpace	input.elm	/^import MyImport as NSpace exposing (impFunc)$/;"	n	module:AMod	roles:def	moduleName:MyImport
8694e964efSNik Silver	MyImport	input.elm	/^import MyImport as NSpace exposing (impFunc)$/;"	m	roles:imported
87*8959a9c3SNik Silver	impFunc	input.elm	/^import MyImport as NSpace exposing (impFunc)$/;"	f	module:MyImport	roles:exposed
8894e964efSNik Silver
8994e964efSNik SilverType names
9094e964efSNik Silver~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
9194e964efSNik Silver
9294e964efSNik SilverConstructors top level functions will have type names.
9394e964efSNik Silver
9494e964efSNik Silver"input.elm"
9594e964efSNik Silver
9694e964efSNik Silver.. code-block:: Elm
9794e964efSNik Silver
9894e964efSNik Silver	funcA : Int -> Int
9994e964efSNik Silver	funcA a = a + 1
10094e964efSNik Silver
10194e964efSNik Silver	type B
10294e964efSNik Silver	    = B1Cons
10394e964efSNik Silver	      { x : Float
10494e964efSNik Silver	      , y : Float
10594e964efSNik Silver	      }
10694e964efSNik Silver	    | B2Cons String Integer
10794e964efSNik Silver	    | B3Cons
10894e964efSNik Silver
10994e964efSNik Silver"output.tags"
11094e964efSNik Silverwith "--options=NONE -o - --sort=no --extras=+r --fields=+r input.elm"
11194e964efSNik Silver
11294e964efSNik Silver.. code-block:: tags
11394e964efSNik Silver
11494e964efSNik Silver	funcA	input.elm	/^funcA a = a + 1$/;"	f	typeref:typename:Int -> Int	roles:def
11594e964efSNik Silver	B	input.elm	/^type B$/;"	t	roles:def
11694e964efSNik Silver	B1Cons	input.elm	/^    = B1Cons$/;"	c	type:B	typeref:typename:{ x : Float , y : Float } -> B	roles:def
11794e964efSNik Silver	B2Cons	input.elm	/^    | B2Cons String Integer$/;"	c	type:B	typeref:typename:String -> Integer -> B	roles:def
11894e964efSNik Silver	B3Cons	input.elm	/^    | B3Cons$/;"	c	type:B	typeref:typename:B	roles:def
11994e964efSNik Silver
12094e964efSNik SilverFunction parameter lists
12194e964efSNik Silver~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
12294e964efSNik Silver
12394e964efSNik SilverFunction parameter lists can be extracted into the tags file
12494e964efSNik Silversignature field. They are not really function signatures, but
12594e964efSNik Silverit's the closest concept available in ctags.
12694e964efSNik SilverUse "--fields=+S".
12794e964efSNik Silver
12894e964efSNik Silver.. code-block:: Elm
12994e964efSNik Silver
13094e964efSNik Silver    funcA a1 a2 =
13194e964efSNik Silver        a1 + a2
13294e964efSNik Silver
13394e964efSNik Silver"output.tags"
13494e964efSNik Silverwith "--sort=no --extras=+r --fields=+rS"
13594e964efSNik Silver
13694e964efSNik Silver.. code-block:: tags
13794e964efSNik Silver
13894e964efSNik Silver    funcA	input.elm	/^funcA a1 a2 =$/;"	f	signature:a1 a2	roles:def
13994e964efSNik Silver
14094e964efSNik SilverKNOWN LIMITATIONS
14194e964efSNik Silver-----------------
14294e964efSNik SilverThe ctags signature field is used for function parameter lists, even
14394e964efSNik Silverthough it's not an idea field. See above.
14494e964efSNik Silver
14594e964efSNik SilverElm requires all statements at the same logical level to have the
14694e964efSNik Silversame indentation. If there is additional indentation that line is part
14794e964efSNik Silverof the previous one. Therefore without over-complicating the
14894e964efSNik SilverPEG parser we have the following limitations...
14994e964efSNik Silver
15094e964efSNik SilverSometimes functions in let/in blocks will be omitted.
15194e964efSNik Silver
15294e964efSNik SilverFunctions in let/in blocks will be marked as being in the scope of their
15394e964efSNik Silverouter function, regardless of how deeply nested the let/in block is.
15494e964efSNik Silver
15594e964efSNik SilverFunctions in let/in blocks won't have type names.
15694e964efSNik Silver
15794e964efSNik SilverSEE ALSO
15894e964efSNik Silver--------
15994e964efSNik Silverctags(1), ctags-client-tools(7)
160