Table of Contents generated with DocToc
- Changelog
- #904 - Don't do
project instanceOf MockProjectEx
because not all IDEs, such as Rider, ship withMockProjectEx
; instead, do aClass#getCanonicalName()
check. - @KronicDeth
- #898 - @KronicDeth
- Update Build Matrix
- Only include IDEA versions within the last year. Prior versions are supported, but not tested. It is up to users stuck on older versions to report incompatibilities and then I'm specifically fix those bugs.
- Add
2017.2
- Drop
2016.1.4
- Add
- Only include Elixir versions within the last year. Prior versions are supported, but not tested. It is up to users stuck on older versions to report incompatibilities and then I'm specifically fix those bugs.
- Add
1.5.2
- Drop
1.3.4
- Add
- Only include OTP versions within the last year. Prior versions are supported, but not tested. It is up to users stuck on older versions to report incompatibilities and then I'm specifically fix those bugs.
- Add
20.1
- Drop
18.3
- Add
- Only include IDEA versions within the last year. Prior versions are supported, but not tested. It is up to users stuck on older versions to report incompatibilities and then I'm specifically fix those bugs.
- Support
not in
grammar added by elixir-lang/elixir#5620 shipped with Elixir 1.5. - Don't treat numeric operands to
@
and unary operators as separate operations from non-numeric operands to port elixir-lang/elixir@9747e58db773c716c01c210642ec1d91475e0c83 that shipped with Elixir 1.5.0. This only kicks in if the Elixir SDK is version >= 1.5.0 or not set. With an earlier SDK, you'll get the earlier behavior.
- Update Build Matrix
- #898 - Make binary infix vs unary prefix
+
/-
handling more robust to supportone(two, - three)
used in Elixir 1.5enum.ex
. - @KronicDeth - #901 - Call
withCharSet(Charsets.UTF_8)
on allGeneralCommandLines
to prevent encoding errors on Windows. - @KronicDeth
- #861 - Regression test for #860 - @KronicDeth
- #862 - Regression test for #859 - @KronicDeth
- #863 - Convert ANSI escape codes to colored output in
mix
Run and Debug output - @KronicDeth - #886 - Regression test for #883 - @KronicDeth
- #887 - Regression test for #878 - @KronicDeth
- #861 - @KronicDeth.
- Quote
-
in addition to#
inUnquoted
MacroNameArity
decompiler. - Quote
-
in decompiled module names.
- Quote
- #862 - Wrap call definitions with name
nil
asunquote(:nil)
in the decompiler. - @KronicDeth - #884 -
Application#runWriteAction
MUST be run from EventDispatch thread. This is true when run from a Run Configuration runner, but when the Credo annotator runsrunWriteAction
, it's not in an EventDispatch thread, so followed IntelliJ Platform SDK DevGuide - General Threading Rules and wrapped therunWriteAction
inApplication#invokeAndWait
. - @KronicDeth - #885 - Wrap
sdkModificator::commitChanges
ininvokeAndWait
runWriteAction
inMixRunningStateUtil#updateRoots
. - @KronicDeth - #886 - @KronicDeth
-
Generalize what needs to be double quoted for
Unquoted
decompiler- Aliases and special forms are bare atoms
- Anything that is NEITHER an identifier NOR a prefix operator is a double quoted atom.
Normal identifiers and prefix operators then fall through to the
Default
decompiler.
-
- #887 - Add
end
toUnquoted
decompiler bare atoms. - @KronicDeth - #888 - Replace
assert
s inCredo
external annotator with extended log messages that record the unexpected line. - @KronicDeth
- #854 - @KronicDeth
credo
external annotator- Once modifications have settled on a file and all internal annotators have run,
mix credo
will be run on any modified file.- Each check failure reported by
mix credo
will be turned into a warning annotation (yellow highlight) of the line or line and column credo identified. - If you hover over the annotation (either in the source or on right gutter), the
mix credo PATH:LINE(:COLUMN)
explanation will be shown. Links in the tooltip are clickable and allow you to jump to the specific line or line and column of the failure.
- Each check failure reported by
- Once modifications have settled on a file and all internal annotators have run,
- #856 - @KronicDeth
- Explain Rich vs Small IDEs more
- Add feature support table for Rich vs Small IDEs with links to alternatives for Rich IDEs features not in Small IDEs.
- Reorder Project subsections based on usage.
- #854 - Rename package with typo
org.elixir_lang.annonator
->org.elixir_lang.annotator
. - @KronicDeth - #855 - @KronicDeth
- Change error to say mix, elixir, or erlang path is not set instead of just mix path.
- Rewrite of
MixRunningStateUtil#setElixir
to support callingerl
directly in IntelliJ IDEA added a check that sdk type was the Elixir SDK Type, but there was noelse
clauses to handle that there IS an SDK, but its NOT Elixir, which is the common case on all Small IDEs (like Rubymine). To fill this gap, if the SDK is not Elixir and a Small IDE is detected, then the SDK Home from Preferences > Other Settings > Elixir External Tools > Elixir SDK > Path will be used to get the absolute path to theelixir
(orelixir.bat
executable and set it in theGeneralCommandLine
.
- #856 - @KronicDeth
- Add missing
**
for bold. - Document alternative setup in Small IDEs
- Put Import from external model first in Project subsections, so that people are more likely to import as a mix project correctly.
- Add missing
- #817 - * Add note to README that atom module names should be prefixed with
:
- @merqlove - #827 - @KronicDeth
-
Elixir SDK will now have an Internal Erlang SDK, which can be supplied one of two ways:
- If
intellij-erlang
is installed: its Erlang SDK can be used - Otherwise: the Erlang SDK for Elixir SDK from this plugin can be used
Either Internal Erlang SDK's home path is used to locate the
erl
(orerl.exe
on Windows) executable and it is used to run Elixir; bypassing theelixir
(orelixir.bat
on Windows) script. Instead, as was done in #789, the ebin directories for the Elixir SDK are passed as-pa
options toerl
.The Elixir SDK's configuration becomes more important: the classpath entries are now the list of
ebin
directories to pass toerl
using-pa
instead of scanning for ebins in the homepath, so additional code paths can be added to the Classpaths configuration and they will be used when runningmix
andmix test
. The classpaths will be initialized to the ebin directories under the home path.- To support migrating from earlier version of the plugin, an SDK will be updated when it is used for Mix ExUnit Run Configurations
- The default Internal Erlang SDK will be set, which uses the latest version of Erlang that can be found on the system. When
intellij-erlang
is installed,intellij-elixir
's Erlang version suggestion is still used becauseintellij-elixir
favors the latest version whileintellij-erlang
favors the first found, which is usually the oldest version. - Update roots (class path, source paths, documentation paths):
- Class path of
HOMEPATH/lib
is replaced withHOMEPATH/lib/APP/ebin
. - Source path of
HOMEPATH/lib
is replaced withHOMEPATH/lib/APP/lib
IF it exists (so only for source SDKs) - Documentation of
http://elixir-lang.org/docs/stable/elixir/
will be replaced withhttps://hexdoc.pm/APP/VERSION
for everyAPP
inHOMEPATH/lib
.
- Class path of
- The default Internal Erlang SDK will be set, which uses the latest version of Erlang that can be found on the system. When
- If
-
- #839 - @KronicDeth
- All
ebin
paths in the Internal Erlang SDK will be copied to the Elixir SDK, so that they are indexed, which makes the Internal Erlang SDK modules show up in Symbol search. - Erlang SDK modules can be completed and then functions in those modules can be completed after typing
.
.- Atoms have References.
- Indexed atoms (from decompiled Erlang
.beams
from the Internal Erlang SDK) will be used for completing atoms as soon the atom is parseable: either after the first letter:
or inside the quotes when making a quoted atom. - Atoms will resolve to modules if the atom is a module name. If the atom is quoted and contains interpolation, it will treat each interpolation as
.*
and look for regex matches to this derived potential atom name.
- Indexed atoms (from decompiled Erlang
- Atoms have References.
- Completions for functions after
.
will now work at the end of file. Previously, completions only worked in the middle of a file, where the.
could parse the next work an existing call, now if that parse doesn't work and the only thing after is a new line, it will still complete.
- All
- #830 - Auto test for mix test case runner will automatically run tests after a change is detected in the project files, which normally happens on save, which happens when losing focus on a changed editor tab by default. - @nivanson
- #840 - Regression test for #821 - @KronicDeth
- #841 - Regression test for #803 - @KronicDeth
- #842 - Regression test for #833 - @KronicDeth
- #843 - Port elixir-lang/elixir#2774: Allow
A-Z
as sigil modifiers in addition toa-z
to supportU
ungreedy modifier that replacedr
ungreedy modifier for regexes. - @KronicDeth
- #816 - Add notice for debug blacklist that it uses atoms, not Aliases, so you need to qualifier module aliases with
Elixir.
- @merqlove - #817 - Support atoms (prefixed with
:
) andElixir.
and plain Aliases for debugger blacklist. - @merqlove - #832 - Add space to import window text - @kentongray
- #840 - Add
END
to allowedkeywordKey
tokens - @KronicDeth - #841 - @KronicDeth
- Only use "Macros" as first header in decompiled
.beam
files ifmacro
isdefmacro
. "Macros" header was being printed when there was only functions because the check when there was nolastMacroNameArity
didn't care what the currentmacroNameArity.macro
was. - When an
.erl
file has-compile([compressed])
, it will be compiled normally, and then gzipped, so that the.beam
will not contain the BEAM magic numberFOR1
, but instead the gzip magic number0x1f
0x8b
. So, to properly handle normal and compressed, the decompiler needs to look-ahead 2-bytes and check the gzip magic number. If the gzip magic number is detected, the InputStream will be passed throughGZIPInputStream
before the the normal decoding process.
- Only use "Macros" as first header in decompiled
- #842 - When decompiling function and macro names from Erlang module, its possible for the name to contain
#
and they would be interpreted as comments. Accepting those names inUnquoted
wouldn't escape the#
from being treated as a comment, so in addition tounquote
ing the name, surround it in double quotes. - @KronicDeth - #848 - @KronicDeth
AdditionalDataConfigurable
only copied the the Internal Erlang SDK Code Paths when the selection in theComboBox
was changed, which meant if the there was only one Erlang SDK or the user never changed the selection, the Code Paths were never copied. To get the Code Paths copied when the Elixir SDK is first created andsetupSdkPaths
interface method is called- All paths are set directly on the Elixir SDK as before
- The default Erlang SDK, which should be the one that was last created, is configured in
SdkAdditionalaData
- The Code paths from the Erlang SDK are copied to the Elixir SDK
- If the the Erlang SDK is from intellij-elixir and does not have
ebin
directories for its Class Paths, then the Class Paths is expanded to Code Paths.
- If the the Erlang SDK is from intellij-elixir and does not have
- #851 - The Code Paths from the Internal Erlang SDK were not being copied from the default Erlang SDK to the Elixir SDK when the default Erlang SDK was set during
mix test
runs, which meant that the Elixir SDK would not upgrade correctly from 6.1.1 to 6.2.0 without the user deleting the Elixir SDK and recreating it. - @KronicDeth
- #795 - When #754 made
intellij-erlang
a soft-dependency, it broke the debugger's icons that referencedErlangIcons
, but it turns out all the icon constants were aliases toAllIcons.Debugger
constants, so by using theAllIcons.Debugger
icons directly, the dependency onErlangIcons
can be removed without the need to copy the image files intointellij-elixir
. - @KronicDeth - #796 - When
do ... end
template is inserted, it did not have a previous child whose attributes to use, so it used the default, which left the cursor unindented. To get the cursor indented by default, When theElementType
isDO
, apply thestabChildrenIndent
rules: indent normal and determine whether to indent relative to direct parent using code style setting. - @KronicDeth - #797 - Include
VirtualFile
path in Beam read errors - @KronicDeth
- #792 - @KronicDeth
- Since the process of requiring resource files is the same,
org.elixir_lang.ElixirModules
has static methods for copying resources out to a temporary directory and adding the-r <temporary_path>
for one or more resource files to a new or existing ParametersList. These are now shared for the Mix ExUnit and Debugger code paths. - Format class
ElixirXDebugProcess
MixExUnitRunningState
MIxRunningState
- Since the process of requiring resource files is the same,
- #792 - The compiled
.beam
files were removed in 58e7d4a, which was before v5.1.0, but not all users had problems with using the debugger. #739 persisted (as reported by @erikreedstrom) when 6.0.0 was released; I retried reproducing on a clean VM and I got it. I'm not sure why it worked for some people in prior releases since the.beam
don't exist that were being copied, but now the debugger uses the same system of copying.ex
files and requiring them with-r
instead of copying.beam
and using-pa
to add theebin
directory. Fix was verified local under macOS and in Windows VM that reproduced #739. - @KronicDeth
- #724 - @KronicDeth
- Code Formatter
do
block lines are indenteddo
blocksend
as the last argument of a no parentheses call unindents to the start of the call- If one clause of a multi-clause anonymous function wraps, all clauses wrap.
- Indent after
else
- Indent map and struct keys
- All keys wrap if any key wraps
- No spaces around...
.
- Spaces around...
and
in
or
when
- Configure spaces around...
=
<-
and\\
!=
,==
,=~
,!==
, and===
<
,<=
,>=
, and>
+
and-
*
and/
- Unary
+
,-
,!
,^
, and~~~
->
::
|
||
and|||
&&
and&&&
<~
,|>
,~>
,<<<
,<<~
,<|>
,<~>
,>>>
, and~>>
..
^^^
++
,--
,..
,<>
=>
- Configure spaces before...
,
- No space after...
@
- Spaces after...
not
fn
after
catch
rescue
key:
- Configure space after...
&
,
- Configure spaces within...
{ }
<< >>
[ ]
( )
- No space around
/
in&NAME/ARITY
and&QUALIFIER.NAME/ARITY
when
wraps when its right operand wraps, so that guards start withwhen
on a newline when they are too long.- Align
|>
at start of indented line for pipelines - Align
end
with start of call instead of start of line fordo
blocks in pipelines - Indent list elements when wrapped
- Indent tuple elements when wrapped
- Align type definition to right of
::
- Align guard to right of
when
when guards span multiple lines - Align two operator (
++
,--
,..
,<>
) operands, so that<>
binaries are multiple lines align their starts instead of using continuation indent and being indented relative to first operand. - Align pipe
|
operands, so that alternates in types and specs are aligned instead of continuation indented relative to the first operand. - Comments in
spec
(that is above operands to|
align with the operands - Remove newlines from pipelines, so that all pipelines start with an initial value or call and each
|>
is the start of a successive line. - Key exclusivity: if an association operation or keyword key is already on a line, the container value automatically has it's elements wrapped if there is nested associations or keyword pairs, so that two levels of keys are not on the same line.
- Indent bit string (
<< >>
) elements when wrapped
- Code Formatter
- #732 - @KronicDeth
- Update IntelliJ IDEA version to latest in each MINOR version:
2017.1.1
->2017.1.5
2016.3.5
->2016.3.7
- Update Elixir version
1.4.2
->1.4.5
- Update IntelliJ IDEA version to latest in each MINOR version:
- #738 - @KronicDeth
TeamCityExUnitFormatting.put_event
- Always match on
%__MODULE__{}
for state in clauses to prevent state update errors - Match on
:suite_finished
and:suite_started
events, so that only events added to the interface will be unknown andIO.warn
can be used tell anyone spotting the new event to file an issue.
- #741 - Instead of pinning position (
1
for lines or3
for heredocs),pin
*_PROMOTER
token, so it's more obvious the pattern is that the promoter is pinned. - @KronicDeth - #747 - Regression test for #659 - @KronicDeth
- #629 - Search for Elixir SDKs in
/nix/store
on Mac if homebrew path does not exist - @KronicDeth - #749 - Regression test for #672 - @KronicDeth
- #750 - Regression test for #674 - @KronicDeth
- #751 - @KronicDeth
- Regression test for #683
- Store expected decompilation in files to shrink
DecompilerTest
length
- #754 - Update to
org.jetbrains.intellij
0.2.15
- @KronicDeth - #755 - Regression test for #687 - @KronicDeth
- #756 - Regression test for #692 - @KronicDeth
- #758 - Regression test for #694 - @KronicDeth
- #759 - Regression test for #699 - @KronicDeth
- #760 - Use
Elixir.LDAPEx.ELDAPv3.beam
as regression test for #703 - @KronicDeth - #764 - Show
quote
s in list in macros in Structure View - @KronicDeth - #768 - References will be cached until the file containing the PSI element changes, so that results from
Callable#multiResolve
,CallDefinitionClause#multiResolve
,Module#multiResolve
, andModuleAttribute#multiResolve
, which are all the extant references, can be cached and invalidated correctly. - @KronicDeth - #769 - Use
ParameterLists
to support Path Variables in program parameters. - @KronicDeth - #774 - @KronicDeth
- Adjust SDK home path when
bin
,lib,
orsrc
to parent directory. - Format
ElixirSdkType
.
- Adjust SDK home path when
- #775 - Regression test for #354 - @KronicDeth
- #777 - @KronicDeth
-
Include specific message for each decompilation error reason.
-
Regression test for #772
-
AtU8
UTF8 atoms chunk decompilation to support OTP 20 compiled.beam
files. -
Regression test for Elixir 1.5.0 announcement to ensure that unicode from
AtU8
chunk can be read from beam file produced by following Elixir code: ```elixir defmodule AtU8Test do def こんにちは世界 do :こんにちは世界saudação = "Bom dia!" saudação end end ```
-
- #771 - Guard against read/write mismatch in stubs - @KronicDeth
- #782 - Always install
IdeaVIM
in the gradle sandbox because it got annoying having to reinstall it when the sandbox reset. - @KronicDeth - #786 - @KronicDeth
- Merge both homebrew and nix store on Mac
- Merge default and nix store on Linux
- #789 - Format
MixRunningStateUtil
and fix warnings. - @KronicDeth
- #726 - @KronicDeth
- Treat
::
the same as:
inkey:
afterwhen
in type specifications as it's a realistic error. - Change
.
to#
when referring to constants in javadocs - Remove
@param
without descriptions - Remove explicit type from generics when the type can be inferred.
- Check if
atNonNumericOperation
reference is non-null
before resolving - Swap empty branches to inverted conditions for final
else
. - Check if
Type
leftOperand
isnull
before using it. - Remove empty
highlightTypesAndTypeParameterUsages(When...)
- Remove unused
highlightTypesAndSpecificationTypeParameterDeclarations
- Flip
equals
to eliminate need fornull
check - Remove redundant type arguments (
<...>
) - Change
Collections.EMPTY_SET
toCollections.emptySet()
to prevent uncheck cast warnings. - Inline constant argument for errors.
- Check if
when
rightOperand
is non-null
before scanning it for parameter names. - Fix typos
- Treat
- #732 - @KronicDeth
- When compilation error is detected during
mix test
, it will be turned into a test failure.- Compilation errors are any stacktraces to
stderr
that end in(elixir) lib/kernel/parallel_require.ex:
. - The test failure for the compilation will be attributed to either
mix test
or the inferred module name of test file.- If the first line of the stacktrace contains
test/.*_test.exs:\d+: \(module\)
- The file and line from that line will be used as the location of failure
- The
test/
and.exs
will be stripped from the file and it will be camelized to produce the derived test module name of the failure
- Otherwise,
mix test
is used
- If the first line of the stacktrace contains
- Compilation errors are any stacktraces to
- Rearrange doc test names to emphasize the function being tested:
"test doc at MODULE.FUNCTION/ARITY (COUNT)"
becomes"MODULE.FUNCTION/ARITY doc (COUNT)"
- If
MODULE
is the same as the test case without theTest
suffix, thenMODULE.
is stripped too and the test name becomes onlyFUNCTION/ARITY doc (COUNT)
- If
- Fix parallel test cases nesting under each other due to asynchronous reporting from formatter.
##teamCity
testSuiteStarted
messages automatically nest, so switched to usingnodeId
andparentNodeId
system, so that nesting is explicit. This will allow multiple parallel tests to show up in GUI too. Elixir.
prefix is stripped from test case names.
- When compilation error is detected during
- #728 - Handle Elixir versions with non-numeric parts - @pazustep
- #734 - Use a separate formatter, one GenEvent-based and one GenServer-based, depending on whether the SDK is >= 1.4.0 as that's when GenEvent was deprecated and GenServer was preferred. - @KronicDeth
- #736 - @KronicDeth
- Merge
Callable
andKernel
annotators - Use
PsiElementVisitor
instead ofPsiRecursiveElementVisitor
, so that macros indefmodule
block don't get double annotated. - Instead of erasing and then applying multiple
TextAttributeKey
, erase as before, but then merge theTextAttributeKey
'sTextAttributes
and apply as singlesetEnforcedTextAttributes
. For some reason, this fixes the inconsistency of whetherPREDEFINED_CALL
orMACRO_CALL
is applied first. - In case of multiple
resolved
s, make those that needPREDEFINED_CALL
to win.
- Merge
- #738 - @KronicDeth
TeamCityExUnitFormatting.new
should return struct only because none of the formatters expects an:ok
tuple.- Fix order of
TeamCityExUnitFormatting.put_Event
catchall parameters. FileReferenceFilter
- Add
.exs
to pattern for stacktrace linking. - Highlight only stacktrace path and line umber instead of entire line
- Better path match in stacktraces
- Only accept VirtualFile if it has a suffix matching the stacktrace's path instead of accepting the first index file with a matching basename.
- Allow multiple VirtualFiles to be linked if it turns out there is a true file path collision between two OTP apps in the Project or Libraries.
- Format and fix warnings
- Add
- #741 - @KronicDeth
- Pin promoter for all quotes, including the previously missing
stringLine
andcharListLine
. - Only insert closing quote if previous token was an opening quote.
- Pin promoter for all quotes, including the previously missing
- #742 - @KronicDeth
- On
unquote
, include argument in name of call definition clause - Look outside tuple containing
quote
forenclosingMacroCall
, which allows going to Phoenix.Template.compile's quote's defp - Treat
Module.create
as `Modular Or
interface to unifyMatched
andUnmatched
Or
s.- Look at both side of
Or
operation for nested child calls for Structure view. - Make
unquote(ARG1)
name forgetName
and indexing
- On
- #744 - @KronicDeth
ElementDescription
forElixirVariable
- Mark
UnqualifiedParenthesesCall
s ascall
instead ofvariable
.
- #745 - @KronicDeth
mix local.hex --force
beforemix deps.get
during project import to prevent prompt for hex update when local hex is earlier than that required bymix
.- Fix warnings and format
MixProjectRootStep
- #746 - @KronicDeth
- Mark
ElixirDecimalFloat
as error in types.- If in a Range: "Floats aren't allowed in Ranges"
- Otherwise: "Float literals are not allowed in types. Use float() instead".
- Mark
- #747 - @KronicDeth
- Ignore
jps-*/out
directories. - Look at parent for
isParameter
forAtUnqualifiedBracketOperation
. - Treat
AtUnqualifiedBracketOperation
the same asUnqualifiedBracketOperation
forisVariable
.
- Ignore
- #748 - Include path in error messages from
buildFileStub
- @KronicDeth - #749 - Erlang allows
do
as a function name, but it's a keyword in Elixir, so wrap it asunquote(:do)
. TheSpecialForm
decompiler already did thisunquote(...)
wrapping, butdo
is a keyword and not a special form, so rename the decompiler toUnquoted
. - @KronicDeth - #750 - @KronicDeth
-
Move {3} inside
|
forSIGIL
PROMOTER
andTERMINATOR
:SIGIL_HEREDOC_PROMOTER = ({SIGIL_DOUBLE_QUOTES_PROMOTER}|> {SIGIL_SINGLE_QUOTES_PROMOTER}){3} SIGIL_HEREDOC_TERMINATOR = ({SIGIL_DOUBLE_QUOTES_TERMINATOR}|> {SIGIL_SINGLE_QUOTES_TERMINATOR}){3}
The
|
is inside group that is then{3}
'd, so it allows either'
or"
in groups of three. This is only applies to the sigils. It's correct for normal string and charlist heredocs:CHAR_LIST_HEREDOC_PROMOTER = {CHAR_LIST_PROMOTER}{3} CHAR_LIST_HEREDOC_TERMINATOR = {CHAR_LIST_TERMINATOR}{3} STRING_HEREDOC_PROMOTER = {STRING_PROMOTER}{3} STRING_HEREDOC_TERMINATOR = {STRING_TERMINATOR}{3} QUOTE_HEREDOC_PROMOTER = {CHAR_LIST_HEREDOC_PROMOTER} | {STRING_HEREDOC_PROMOTER} QUOTE_HEREDOC_TERMINATOR = {CHAR_LIST_HEREDOC_TERMINATOR} | {STRING_HEREDOC_TERMINATOR}
-
- #751 - Unquote function names that start with an uppercase codepoint, so that they aren't parsed as Aliases. These function names occur in the CORBA modules in OTP. - @KronicDeth
- #754 - @KronicDeth
- Using intellij.plugins will prevent packaging intellij-erlang as a runtime dependency, which leads to duplicate templates.
- Don't use the
JPS
type
forjps-*
projects because their deps become incompatible with other projects.
- #755 - Add missing
break
s tocase
statement inprocessDeclarations(Match, ...)
that caused the logic of whether to check left, right, or both operand based on the whether the treeWalkUp came from always fell through to theRIGHT
case, so it was only, always checking the right operand of the match and never the left operand. - @KronicDeth - #756 - Skip
processDeclarationsInPreviousSibling
whenlastParent
isElixirFile
- @KronicDeth - #757 - Remove background color from sigils because it stands out really badly in the Default theme where it's black on white and while it doesn't in Darcula, it's unnecessary there because it's so close to the editor background color in Darcula. - @KronicDeth
- #758 - Treat
Alias
as miscapitalized type parameter. @KronicDeth - #759 - Ignore call definition clauses after
when
in type specifications as it is a common occurrence when typing a specification above a pre-existing call definition clause. - @KronicDeth - #761 - Use
THashSet
instead of the more specificSmartHashSet
becauseTHashSet
allowsnull
keys, which are expected for thecanonicalNameSet
. - @KronicDeth - #764 - @KronicDeth
- Look above
List
for enclosing modular macro. - Look above
ElixirNoParenthesesManyStrictNoParenthesesExpression
for enclosing modular macro.
- Look above
- #765 - Remove background color from Sigil Color Scheme Design to match changes in #757. - @KronicDeth
- #769 - @KronicDeth
- Check if program parameters is blank before splitting into mix args.
- Use
ParametersList
to properly parse quote program parameters.
- #773 - @KronicDeth
- Move
Quoter
intotest
directory, so it and its dependency onJUnit
is only used for test compilation and runtime and not the shipped runtime. - Fix
Quoter
warnings and format.
- Move
- #774 - @KronicDeth
- #775 - Always check if resolution result is right operand of match. - @KronicDeth
- #776 -
CallDefinitionClause
InsertHandler
always assumed there was a character after the insert location, but when inserting at the very end of the file, there isn't, which caused anIndexOutOfBoundsException
. Only check if the following character is not a space,(
, or[
when the document is longer than the tail offset to prevent theIndexOutOfBoundsException
. If the insertion is at the end of the file, then the()
will always be inserted. - @KronicDeth - #777 -
Decompilated
->Decompilation
- @KronicDeth - #771 - The lower-level
Data(Output|IntputStream
(write|read)Int
don't work correctly with sizes, so use the JetBrains(write|read)VarInt
ones instead. - @KronicDeth - #782 - Delegate
ChildAttributes
to previous child when available:Block.getChildAttributes
is used when Enter is pressed to determine the indentation and alignment. Using the default implementation, newlines in stabs look overly indented, but there is a constant,DELEGATE_TO_PREV_CHILD
that can be used to just use the last child's indent as long as there is one, which appears to work well for stabs (do block bodies, etc). - @KronicDeth - #783 - @KronicDeth
- Increase suspect
nameSetSize
from4
to10
because aPoison.Encoder
has animpl
module for 4 types, and so has 4 canonical names. - Only read-ahead if guard length is non-zero; otherwise, only warn the nameSetSize may be suspect and don't read-ahead as this can mess up OK namesets.
- Increase suspect
- #784 - @KronicDeth
- Override
Kernel.SpecialFroms
arity intervalsalias
overridden from2
to1-2
to support without:as
option.import
overridden from2
to1-2
to support without:except
or:only
options.quote
overridden from2
to1-2
to support block without options.require
overridden from2
to1-2
to support without:as
option.super
overridden from1
to0-
to support calling any super method.
- Override
- #789 -
elixir.bat
in at least Elixir 1.5.1, will not properly parse a mix path with spaces in it on Windows even when the path has outer quotes (see elixir-lang/elixir#6455). It is not possible to use inner quotes, as you can do in cmd.exe, using the JetBrains and Java libraries hat auto-matically quote, so instead bypass the bad quoting inelixir.bat
by doing whatelixir.bat
does: callerl.exe
with all the SDK ebin paths added with-pa
, then-noshell -s elixir start_cli
to run Elixir and-extra
to run requires (-r
), mix and its tasks. - @KronicDeth
- #732 - @KronicDeth
- Drop
14.1.X
support because it does not have support for nodeId test output, so it's not possible to handle the ExUnit test output in a safe manner while still allowing concurrent output for asynchronous tests.
- Drop
- #643 - Graphical debugger with line breakpoints - @JakeBecker
- #673 - Add Debugger to README - @KronicDeth
- #669 - Replace
assert scope.isEquivalentTo(lastParent.getParent())
with anif
and log whatlastParent
was when condition isfalse
, so root cause can be traced. - @KronicDeth
- #574 - @KronicDeth
- Decompile
.beam
files- Structure view for decompiled
.beam
files - Index modules, functions, and macros exported by
.beam
files - Go To Symbol for Modules defined in
.beam
files (both SDK and deps)- Erlang using atoms (like
:idna
) - Elixir using Alias (like
Enum
)
- Erlang using atoms (like
- Completion for Modules defined in
.beam
files (both SDK and deps)- Elixir using Alias (like
Enum
)
- Elixir using Alias (like
- Completion for functions and macros exported by
.beam
files - Syntax highlighting
- Structure view for decompiled
- Decompile
- #579 - Regression test for #575 - @KronicDeth
- #583 - @KronicDeth
- Macros appear before functions in decompiled
.beam
files- Header for macro and function sections
- Macros appear before functions in decompiled
- #585 - @KronicDeth
- Update
ELIXIR_VERSION
for1.2.*
from1.2.3
to1.2.6
- Add
ELIXIR_VERSION
1.3.4
- Add
ELIXIR_VERSION
1.4.0
- Update
IDEA
for2016.*
to2016.3.1
- Show
OtpErlangBitStr
(and thereforeOtpErlangBinary
contents when tests fail - Quote binaries as
to_charlist
instead ofto_char_list
for Elixir>= 1.3
. Depends on Elixir version of project SDK. - Use
elixir
instead ofjava
VM, so now Erlang and Elixir don't need to be built on travis-ci, butant
and thejdk
need to be installed, but unlike Erlang and Elixir, there are tarballs for that, so this way is faster than the old method without depending on travis-ci cache.
- Update
- #609 - @KronicDeth
- If
multiResolve
causes aStackOverflow
fororg.elixir_lang.annotator.Callable.visitCall
, thencatch
it and useerrorreport
logger to log the element. - Include file path in
errorreport
excerpt - Log element for
StackOverflow
related toimport
s - Regression test for #605.
- Log
LookupElement#getObject
whenLookupElement#getPsiElement
isnull
to track down how it wasnull
in #563.
- If
- #614 - Regression test for #559 - @KronicDeth
- #504 - @JakeBecker
- Switch to Gradle for builds.
./gradlew runIde
(or therunIde (VERSION)
Run Configurations) will run IDEA in a sandbox with the development version of the plugin../gradlew test
(or thetest (VERSION)
Run Configurations) will run the main plugin and jps-builder tests.- The plugin can now be published with
./gradlew publishPlugin
, BUT you'll need to fill inpublish*
properties ingradle.properties
. This will eventually allow for automated "nightlies" from successful Travis-CI builds onmaster
.
- Switch to Gradle for builds.
- #638 - The
Callable
annotator is meant for variables, parameters, and macro and function calls and declarations. TheModuleAttribute
annotator handles module attribute declaration and usage, so we can save reference resolution time by skipping module attributes inCallable
. - @KronicDeth - #640 - Allow module attribute folding to be configured. - @KronicDeth
- #662 - @KronicDeth
- Allow call definition heads to resolves to themselves for consistency with Aliases of
defmodule
. - Generalize
Callable.callDefinitionClauseDefiner(Call)
: in addition to the currentCallDefinitionClause
, make it work forImplementation
,Module
, andProtocol
.
- Allow call definition heads to resolves to themselves for consistency with Aliases of
- #574 - Fix copy-paste errors in
MatchOperatorInsteadOfTypeOperator
- @KronicDeth - #579 - @KronicDeth
- Subtract 1 from arity in
.beam
file when decompiling todefmacro
calls because the Erlang function for Elixir macros has one addition argument: the first argument is theCaller
of the macro. - If the name of the decompiled macro/function is an infix operator, then decompile the head as a binary operation instead of a normal prefix name as infix operators aren't valid prefix names and led to parsing errors, which was the root cause of #575.
- Fix IntelliJ warnings in
BeamFileImpl
- Remove unused
VirtualFile
argument toBeamFileImpl#buildFileStub
.
- Subtract 1 from arity in
- #583 - @KronicDeth
- Add
++
,=~
, andin
toINFIX_OPERATOR_SET
. - Only render infix operators if arity is
2
. - Prefix operator decompilation:
+
and-
are both binary and unary operators. When a unary operator they need to be wrapped in parentheses, so that the call definition clause is parsed correctly.
- Add
- #585 - @KronicDeth
- Ignore
JFLex
jar - Don't check for
elixir-lang/elixr
files remove in1.3
- Allow
nil
as a keyword key.nil
was being lexed as a potential keyword key, but NIL was missing from the token list in the keywordKey grammar rule.
- Ignore
- #599 - Some SpecialForms don't work as literals as they would be interpreted as metaprogramming, so their name needs to be wrapped as an atom to
unquote
. - @KronicDeth - #600 - @KronicDeth
- Check children of
MultipleAliases
for variable declarations. - Treat any variable declared in a
MultipleAliases
as invalid.
- Check children of
- #609 - @KronicDeth
- Skip
import Kernel
inkernel.ex
to prevent stack overflow due to recursiveimport
- Strip all outer parentheses for left type operand, so that
(+value)
can be see as+
operator type spec. - Use advice from
IndexNotReadyException
documentation and checkDumbService.isDumb(Project)
before callingStubIndex.getElements
inModule
andmodule.MultiResolve.indexNameElements
. - Don't
assert
thatLookupElement#getPsiElement
is notnull
inCallDefinitionCluase.renderElement
- Update to
ant
1.10.1
because1.10.0
is no longer hosted.
- Skip
- #612 - Yeah, it sounds weird, but an
ElixirVariable
isn't necessarily a variable if it doesn't occur in a declaration context. It could just be a no-parentheses function call in the wrong spot, so check the parentPsiElement
to determine ifElixirVariable
is a variable. - @KronicDeth - #614 - Highlight parameterized type head (
maybe(t)
in@type maybe(t)
) the same as a full type definition (maybe(t)
in@type maybe(t) :: t | nil
) - @KronicDeth - #616 - Only show Mix ExUnit Run in context when the module, or when the module is not a available, the project SDK is Elixir. If there is no SDK configured, show "Mix ExUnit Run" in the menu. - @KronicDeth
- #617 - Mark
do:
as atom in demo text - @KronicDeth - #627 - Annotations can only be applied to the single, active file, which belongs to the
referrer
Callable
. Theresolved
may be outside the file if it is a cross-file function or macro usage, in which case it'sTextRange
should not be highlighted because it is referring to offsets in a different file. - @KronicDeth - #634 - @KronicDeth
Variable
scope forQualifiedMultipleAliases
, which occurs when qualified call occurs over a line with assignment to a tuple, such asQualifier.\n{:ok, value} = call()
- Remove call definition clauses (function or macro) completion for bare words as it had a detrimental impact on typing feedback (the editor still took input, but it wasn't rendered until the completion returned OR
ESC
was hit to cancel the completion, which became excessive once the index of call definition clauses was expanded by the decompilation of the Elixir standard library.beam
s, so disable it. If bare-words completion is restored. It will either (1) need to not use theReference#getVariants()
API because it generates too many objects that need to be thrown away or (2) need to only complete call definition clauses that are provably in-scope from imports or other macros.
- #636 - @KronicDeth
- Both intellij-erlang and intellij-community are Apache 2.0 licensed and its the default license for Elixir projects, so seems like a good choice for
LICENSE.md
- Add
CODE_OF_CONDUCT.md
- Both intellij-erlang and intellij-community are Apache 2.0 licensed and its the default license for Elixir projects, so seems like a good choice for
- #638 - @KronicDeth
- The run configurations I put together in #504 didn't allow for the debugger to work properly: neither pause nor breakpoints had any effect, so regenerate them from the Gradle pane.
- Check parent of
when
operation in case it's a guarded function head inorg.elixir_lang.annonator.Parameter.putParameterized(Parameter, PsiElement)
- Instead of highlighting call definition clauses when they are referred to, which only works if it is in the same file, highlight all function and macro declarations when the
def*
call is encountered. - Only increment arity for right pipe operand instead of all operands, so that left operands resolve to correct arity or as variable/parameter.
- #662 - @KronicDeth
- Override
ModuleImpl#getProject()
to preventStackOverflowError
. Without overriding#getProject()
,IdentifierHighlighterPass
gets stuck in a loop betweengetManager
andgetProject
on the target (theModuleImpl
) when clicking on the space betweendef
s ordefmacro
s in the decompiled.beam
files. - Fix source formatting
- Skip looking for variables unless 0-arity AND no arguments
- Highlight unresolved macros as macro calls. Anything with a do keyword or a do block will be treated like a macro call even if it can't be resolved. No resolved is either no resolve results or an empty list
- Implicit imports at top of file in addition to top of Module.
- Override
- #663 - @KronicDeth
CallDefinitionClause
completion provider is unexpectedly invoked both when.
is typed, but continues to be invoked after a letter is typed after the.
; however, once the letter is typed, the letter becomes the default prefix instead, so the prefix should only be reset to""
when it ends in.
.- Disable
Callable#getVariants
unlessUnqualified
to prevents local functions and macros being shown as completions for qualified names.
- #651 - @StabbyMcDuck
- Among many other tweaks, the String color is now green, so that Atom and String are no longer close to one another, which was the original issue in #569
Alias
now hasunderscored
effectBrackets
are now greenish instead of brownishCallbacks
are now a lighter blue and hasunderscored
effectCharList
is little lighterCharToken
is dark yellow now instead of dark purpleDot
is now purple instead of dark redExpression Substitution Mark
is a little lighterInterpolation
is now lime greenKernel Macros
are a burnt orangeMap
is now a dark blue instead of a dark yellowOperation Sign
is a little lighterParameters
are a little darkerParentheses
are redderPredefined
is orange instead of blueSpecification
is now red instead of purpleStruct
is now purple instead of yellowType
is now green instead of dark purpleVariable
is more tealish
- Among many other tweaks, the String color is now green, so that Atom and String are no longer close to one another, which was the original issue in #569
- #650 - @StabbyMcDuck
- Fix indentation to fix sub-lists in
CONTRIBUTING.md
- Fix pluralization in
CONTRIBUTING.md
- Fix indentation to fix sub-lists in
- #664 - @KronicDeth
- Check if resolve results are
null
forFor.resolveResultList
- Check if
Protocol.resolveResultList
isnull
- Check if resolve results are
- #665 - Check
match
Call
is anUnqualifiedNoArgumentCall
, in addition to being 0 resolved final arity, before checking if the name matches. - @KronicDeth
- #585 - Move
^^^
to its own three-operator precedence level to match1.2
. This does mean the parsing will be wrong for Elixir1.1
, but is simpler than maintaining two grammars for those that are still using Elixir1.1
- @KronicDeth - #504 - The
ant
build files have been removed. To build the build plugin (for Install From Disk), use the./gradlew buildPlugin
. - @JakeBecker - #640 - Change to module attribute folding to off by default. - @KronicDeth
- #523 - Use the
CommonProgramParametersPanel
to get the working directory and environment variables the same way the JUnit form does. Replace the custom "Command" input with the "Program arguments" input built into theCommonProgramParametersPanel
.CommonProgramParametersPanel
expects to store the "Program Arguments" in a "ProgramParameters" field, so old run configurations will lose their "Command" option value and it will be migrated to the new "ProgramParameters". - @KronicDeth - #482 - @JakeBecker, @KronicDeth
- Create / Run Mix ExUnit Run Configurations
- Run Configuration from Directory
- Run Configuration from File
- Run Configuration from LIne
- Run Configurations support Common Program Parameters
- Program Arguments
- Working directory
- Environment variables
- Create / Run Mix ExUnit Run Configurations
- #531 - @KronicDeth
enclosingMacroCall
returns enclosing macro call when parent isElixirDoBlock
, so thatend
element goes to the macro call.Navigate > Test
will go to the Module that has the same canonical name as the currentdefimpl
,defmodule
,defprotocol
, orquote
with aTest
suffix addedNavigate > Test Subject
will go to thedefimpl
,defmodule
,defprotocol
, orquote
that has the same canonical name as the current Module with theTest
suffix removed.
- #533 - Regression test for #500 - @KronicDeth
- #545 - Regression test for #517 - @KronicDeth
- #548 - Regression test for #521 - @KronicDeth
- #549 - @KronicDeth
- Regression test for #525
- If
:
is used instead of::
for a type specification, mark it as an error with a Quick Fix to convert:
to::
. - Highlight
=
operands the same as::
operands in type specifications. - If
=
is used instead of::
in a type specification, mark it as an error with a Quick Fix to convert=
to::
.
- #523 - Fix typo:
myRunInModuleChekcBox
=>myRunInModuleCheckBox
- @KronicDeth - #532 - Don't log error when name length exceeds presentable text length because it appears to be common for normal users and not a development environment artifact. - @KronicDeth
- #533 - Check parent of
ElixirMultipleAliases
forisVariable
becauseElixirMultipleAliases
can be hit inisVariable
whenMyAlias.
is added on a line above a pre-existing tuple, such as when typing a new qualified call. - @KronicDeth - #534 - Add space between variable and match in lookup element presentation - @KronicDeth
- #535 - Check
VirtualFile
is not null before creating attachment becausePsiFile
can lack aVirtualFile
if thePsiFile
only exists in memory. - @KronicDeth - #537 - Convert
CallDefinitionClause(Call)
toCallDefinitionClause.fromCall(Call)
, so thatnull
can be returned whenCallDefinitionClause.enclosingModular(Call)
returnsnull
. - @KronicDeth - #539 - @KronicDeth
- Use
functionName
instead ofgetName
when multiresolving unqualified functions becausegetName
will return the Alias when called ondefmodule
. maybeQualifiedCallToModular
returnednull
BOTH (1) if the call was unqualified OR (2) if the call was qualified, but its modular could not be resolved, so qualified calls to.beam
-only modules, likeFile.read!
returnednull
becauseFile
could not be resolved to a modular. RemovemaybeqQualifiedToModular
and callqualifiedToModular
whenmyElement
is qualified. If the modular isnull
, then return an emptyResolveResult[]
instead of looking for unqualified matches.- Pass
maxScope
toModule
reference.maxScope
is generally the containing file for the element, but when usingModule
to resolveimport
s, it is theimport
call's parent element, so that the resolve doesn't ricochet between thedefmodule
and its child, theimport
call untilStackOverflowError
.
- Use
- #545 - A variable cannot be declared in update arguments, so return
LocalSearchScope.EMPTY
, the same as interpolation. - @KronicDeth - #548 -
ElixirSystemUtil.getProcessOutput
already allowed for an empty, invalidProcessOutput
when theworkDir
wasn't a directory, so allow it to also benull
and return the emptyProcessOutput
. - @KronicDeth - #549 - @KronicDeth
- If a single keyword pair is used for a type spec, treat
:
as a type for::
- Limit variable use scope for variables "declared" in module attributes to the module attribute because the variable can't be declared there and it is really a variable usage without declaration.
- If a single keyword pair is used for a type spec, treat
- #454 - Regression test for #453 - @KronicDeth
- #455 - Regression test for #446 - @KronicDeth
- #464 - Show element class in all error reports - @KronicDeth
- #465 - Regression test for #456 - @KronicDeth
- #466 - Regression test for #458 - @KronicDeth
- #467 - Regression tests for #443 - @KronicDeth
- #474 - Regression test for #462 - @KronicDeth
- #476 - Regression test for #468 - @KronicDeth
- #477 - @KronicDeth
- Regression test for #469
- Highlight Strings and String Heredocs as errors in types.
- #479 - Regression tests for #470 - @KronicDeth
- #483 - @KronicDeth
- Add
Qualified#qualifier
by extracting it fromCallDefinitionClause
CompletionProvider
. - Add
Modular
class with#forEachCallDefinitionClauseNameIdentifier
to enumerate all the identifiers that could be linked to in a modular. - Add
ElixirPsiImplUtil#maybeQualifiedCallToModular
by extractingresolveFully
fromCallDefinitionClause
CompletionProvider
- Add regression tests for #463.
- Add
- #484 - Regression test for #471 - @KronicDeth
- #485 - Regression test for #472 - @KronicDeth
- #486 - @KronicDeth
- Extract
Arrow
interface for*ArrowOperation
s. - Regression tests for #480
- Extract
- #454 - Return
emptySet
whenlookupElementByPsiElement
isnull
. - @KronicDeth - #455 - @KronicDeth
-
Don't do a naked
assert
that there are 2 children because this can fail during error recovery on the operand, instead use theprefix.Normalized.operand()
throughprefix.operand()
.WARNING: This changes the
@NotNull
array so that its sole element changes from@NotNull
to@Nullable
. It may trigger new bugs.
-
- #461 - Use shipped
GeneratedParserUtilBase.DUMMY_BLOCK
because theDUMMY_BLOCK
MUST match theGeneratedParserUtilBase
to detect dummy blocks inserted for error handling. - @KronicDeth - #465 - Skip over
ElixirNoParenthesesStrict
forisVariable
- @KronicDeth - #466 - Allow newlines before
do
indoBlock
- @KronicDeth - #467 - Don't match
do
orfn
toend
when used as a keyword key. - @KronicDeth - #474 - @KronicDeth
- Check if
iterator.atEnd()
before callingiterator.getTokenType()
to avoidIndexOutOfBounds
exception. - Don't add current call definition clause being written to completion
- Check if
- #476 -
When#leftOperand
will returnnull
(because it's normalized) if there are left-hand error elements, but when stripping guards we want best-effort to match human expectations, so don't use normalizednull
, but use left, non-error element if it is unique. - @KronicDeth - #477 - Highlight types in
QualifiedNoParenthesesCall
- @KronicDeth - #478 - Still not obvious why
name
for aCallDefinitionClause
lookup renderer can be longer thanpresentableText
, so still log an error, but withLogger.error
, so we getname
,presentableText
, and the originalelement
. - @KronicDeth - #479 - @KronicDeth
- Skip
Arguments
elements inpreviousParentExpresion
to eliminate an unnecessary level of processing declarations since calls will enter their arguments. - Only put new
ENTRANCE
inResolveState
invariable.MultiResolve.resolveResultList
, so that caller can override the default value. - Set
ENTRANCE
tomatchAncestor
instead of previous expression to eliminate the looping that occurred when a variable was unbound (or a function) because the check forwith
(andfor
) was expecting theENTRANCE
to be the previous child expression instead of thewith
clause as a whole (or theArguments
element as had been the case before 6fcc19b).
- Skip
- #483 - @KronicDeth
- Resolves functions qualified by Aliases that are either direct Module references or one-step aliases.
- Remove
Call#resolvedFunctionName
becauseimport
can't rename functions.
- #484 - Don't type-highlight
BracketOperation
s as they occur when putting maps or structs in front of lists. - @KronicDeth - #485 - Treat
Enum.each
the same asEnum.map
arounddef
- @KronicDeth - #486 - Increase
resolvedFinalArity
by1
for piping. - @KronicDeth - #498 - @KronicDeth
- Go To Declaration resolves through
import
- for
import MyModule
- the
import
statement - the call definition clause in the imported Module.
- the
- for
import MyModule, only: [name: arity]
- the
import
statement - the call definition clause in the imported Module.
- the
- for
import MyModule, except: [name: arity]
if reference is notname/arity
.- the
import
statement - the call definition clause in the imported Module.
- the
- for
- Go To Declaration resolves through
- #452 - @KronicDeth
- Go To Declaration for functions and macros (only those defined in parseable-Elixir source. References to Erlang functions or only those available in
.beam
file, such as the standard library will not resolve.) - Completion for functions and macros (only those defined in parseable-Elixir source. Erlang functions and Elixir function only in compiled
.beam
file, such as the standard library will not complete.)- Completion uses the same presentation as Structure View, so the you can tell whether the name is a function/macro, whether it is public/private, and the Module where it is defined.
- Completed functions/macro insert
()
after the name in preparation for Elixir 1.4 where it is an error to have bare function calls. It also makes it more obvious that you inserted a function and not a variable. - Completion works for all functions when a bare identifier is used. For a qualified identifier, only functions/macros under than Module are shown.
- Go To Declaration for functions and macros (only those defined in parseable-Elixir source. References to Erlang functions or only those available in
- #419 - Regression test using
typespec_test.exs
that triggered #413 - @KronicDeth - #425 - Regression test that checks the correct
import
is used forGeneratedParserUtilBase
inElixirParser
- @KronicDeth - #432 - @KronicDeth
- Completion of multiple aliases inside curly braces
- Override
ElixirMultipleAliases#processDeclarations
, so thattreeWalkUp
can stop atElixirMultipleAliases
when determining how to do Alias completion. If a multiple alias is encountered, then de-prefixed names should be returned.
- Override
- Completion of multiple aliases inside curly braces
- #434 - Regression test for #429 - @KronicDeth
- #435 - Regression test for #422 - @KronicDeth
- #439 - Regression test for #438 - @KronicDeth
- #440 - Regression test for #431 - @KronicDeth
- #441 - Regression test for #436 - @KronicDeth
- #419 - @KronicDeth
- Return empty
Set
instead ofnull
fromcanonicalNameSet
- Highlight types in
ElixirMapUpdateArguments
even though they are an invalid typespec example from elixir-lang/elixir tests
- Return empty
- #424 - Check if
rightOperand
isnull
when highlighting types forType
, which can occur when typing:
for an atom after the::
for aType
- @KronicDeth - #425 - Use
GeneratedParserUtilBase
synced to GrammarKit version as was done originally in #406 - @KronicDeth - #426 - Check parent of
BracketArguments
forisParameter
andisVariable
- @KronicDeth - #428 - Instead of asserting that a
QualifiableAlias
has 3 children, which may not be true on error recovery, use theNormalized
static methods that are used elsewhere to handle error recovery around Infix operations as the.
inQualifiableAlias
es is a pseudo-Infix - @KronicDeth - #432 - Add missing
@Nullable
to@NotNull
change when parser wasn't regenerated whencanonicalNameSet
was changed to@NotNull
in the interface. - @KronicDeth - #434 - Search above block items and block lists for calls to check use scope - @KronicDeth
- #435 - Check parent
isVariable
forElixirNoParenthesesManyStrictNoParenthesesExpression
- @KronicDeth - #439 - Highlight
@type
without::
- @KronicDeth - #440 -
ElixirNoParenthesesManyStrictNoParenthesesExpression
indicates an ambiguous no parentheses nesting, but the highlighting should not error and do a best effort instead. - @KronicDeth - #441 -
isParameter(Call)
calledisParameter
on its parent if it wasn't a call definition clause, delegation or macro, butisParameter(PsiElement)
immediately callsgetParent()
and does all theinstanceof
tests on the parent. So, instead ofisParameter(Call)
callingisParameter(PsiElement)
on its parent, it should just call it on itself, this way the check forElixirInterpolation
will not be skipped and there's no need to handleElixirInterpolatedString
. - @KronicDeth
- #387 - Resolve aliased modules to their
alias
call, from the alias call, you can Go To Declaration for the module itself. - @KronicDeth- Code structure
- Module resolution uses the OpenAPI convention of
treeWalkUp
now instead of custom code. - Resolvable names has been extracted to its own class
- Module resolution uses the OpenAPI convention of
- Resolution use cases
Suffix
resolves toalias Prefix.Suffix
Suffix.Nested
resolves toalias Prefix.Suffix
As
resolvesto
alias Prefix.Suffix, as: As`NestedSuffix
resolves toalias __MODULE__.NestedSuffix
- Code structure
- #389 - Completion for module aliases - @KronicDeth
- From in-file aliases
__MODULE__
- In project modules (using index already used for Go To Declaration)
- #393 - In addition to
StubBased#canonicalName
, there now alsoStubBased#canonicalNames
, for when a call defines multiple canonical names, as is the case fordefimpl <PROTOCOL>, for: [<TYPE>, ...]
. - @KronicDeth - #397 - When a aliased name is added to the module list for completion, it's unaliased name is searched for in the
AllName
index, if any nested modules are found for the unaliased name, then those nested names are aliased and also shown for completion. - @KronicDeth - #399 -
resolvableName
allows nested modules under multiple aliases to be completed. - @KronicDeth - #403 - By user request, the folding will be off-by-default now, but can be re-enabled, like the old behavior by checking the checkbox in Preferences > Editor > General > Code Folding > Elixir Module directive (
alias
,import
,require
oruse
) groups. - @KronicDeth - #405 - @KronicDeth
- Resolve
as:
aliased name to bothalias
anddefmodule
- Complete modules nested under
as:
aliased name.
- Resolve
- #409 - @KronicDeth
- Completion and reference tests for aliases:
alias Prefix.Suffix
alias Prefix.Suffix, as: As
alias Prefix.{MultipleAliasA, MultipleAliasB}
- Completion and reference tests for aliases:
- #393 - @KronicDeth
defimpl <PROTOCOL>, for: [<TYPE>, ...]
generates multiple canonical names, which are stored in the stub index.- When retrieved from the
AllName
index, thedefimpl
's Implementation will render as if only thedefimpl <PROTOCOL>, for: <TYPE>
was used for the<TYPE>
matching the lookup name in the Goto Symbol dialog. For example, if you search forTuple
,JSX.Encoder.Tuple
will match fordefimpl JSX.Encoder, for: for: [Tuple, PID, Port, Reference, Function, Any]
.
- When retrieved from the
- #400 - @KronicDeth
- Look outside Enum.map for enclosing macro call because
Ecto
defines the clauses of__schema__(:type, ...)
usingEnum.map
, butenclosingMacroCall
only knews to jump over enclosing macros likefor
, so a special case was added for anonymous function given toEnum.map
. - Fix if-else-ordering bug where
Call
appeared before operations (which are usuallyCall
s) likeMatch
.
- Look outside Enum.map for enclosing macro call because
- #401 - In
@type unquote({name, nil, []}) :: foo
,name
will be highlighted as a type parameter even though it is not strictly the name that will appear as a type parameter. - @KronicDeth - #405 - @KronicDeth
- Resolve alias nested under aliased modules to both the
alias
anddefmodule
, as resolving to only thealias
loses the nested name, so it wasn't possible to jump to the nested name'sdefmodule
. - Resolve aliased name to both the
alias
and thedefmodule
, so you can skip jumping to thealias
before jumping to thedefmodule
.
- Resolve alias nested under aliased modules to both the
- #406 - @KronicDeth
- The generated
ElixirParser
uses theGeneratedParserUtilBase
fromcom.intellij.lang.parser
, but since that version is a synced copy, it is a snapshot ofGeneratedParserUtilBase
from the version of GrammarKit that was current when the IDE was released. To ensure the generated parser works on all the IDEs, I copyGeneratedParserUtilBase
fromorg.intellij.grammar.parser
intoorg.elixir_lang.grammar.parser
and then use that version inElixirParser
. This ensures neither the IDE's version nor the version in any installed GrammarKit plugin is used.
- The generated
- #409 - @KronicDeth
- Check that index name maps to an actual project element before returning it for completion as the names from
StubIndex.getInstance.getAllKeys(...)
is a superset of actual keys in the actual project according to Peter Gromov of JetBrains. - Don't index
canonicalName
if it matches the literal name, as the duplicate name leads to duplicate entries in the completion lookup.canonicalNameCollection
was renamed tocanonicalNameSet
(with type changing fromCollection<String>
toSet<String>
to match) to emphasize that the canonical names should be unique, butcanonicalNameSet
itself should still include duplicates of name for those places where only canonical names are used.
- Use
resolvableName
for theunaliasedName
forMultipleAliases
Aliases, so that they complete correctly for nested modules. - Completion for nested modules will no longer complete with string suffixes (i.e.
SSHView
) and only complete nested Aliases (i.e.SSH.Key
).
- Check that index name maps to an actual project element before returning it for completion as the names from
- #371 - @KronicDeth
BraceMatcher
- Matches the following pairs:
do
toend
fn
toend
"""
to"""
'''
to'''
<<
to>>
<
to>
[
to]
{
to}
(
to)
- Completes the following pairs:
[
with]
{
with}
(
with)
- Matches the following pairs:
QuoteHandler
completes standard quotes (that start with"
or'
)'
with'
"
with"
'''
with'''
"""
with"""
TypedHandler
completes the non-standard quotes and bracesdo
withend
fn
withend
with
>>`<
with>
(for promoters)/
with/
(for promoters)|
with|
(for promoters)
- #372 - Check parent for
isVariable(ElixirMapUpdateArguments)
- @KronicDeth - #374 - @KronicDeth
- IntelliJ 15.0.4 is no longer available from JetBrains, so if the cache is not available, the builds don't work, so use 15.0.6, which is available in 15.0.4's place as the test version for 15.X.
- IntelliJ 2016.2 is no longer available from JetBrains, so if the cache is not available, the builds don't work, so use 2016.2, which is available in 2016.1's places at the test version for 2016.X.
- #378 -
enclosingMacroCall
could climb out the stab after ado
, but not theelse
in anif
, which is used for defined functions conditionally inPhoenix.Endpoint.server/0
- @KronicDeth - #380 - A lot of ppl use the doc template after already typing
@
, but the doc template starts with@
, so it ends up inserting@@doc ...
. The@doc
template is the same code, but since the name starts with@
, it doesn't insert a second@
. Unfortunately, the template search code doesn't prompt when just typing@
, so you end up having to type@doc
before only one template is selected. The@doc
template will show in the lookup as soon as@d
is typed, but you have to select it from the list then before tabbing to accept. - @KronicDeth - #381 - Look at end of
do
instead of start forend
completion to stop ignoring the:
indo:
, whencaret - 3
would land on theo
, now all tests are meant to land on theo
, sodo:
won't complete withend
incorrectly anymore. - @KronicDeth - #382 - Ignore
ElixirVariable
inhighlightTypesAndTypeParameterUsages
- @KronicDeth
- #331 - @KronicDeth
- Allow
do end
blocks to fold todo: ...
- Allow
->
operator and the right operand to fold to-> ...
- Allow
@doc
,@moduledoc
and@typedoc
value to fold to"..."
. - Fold runs of adjacent
alias
,import
,require
, oruse
to be followed to a singlealias
,import
,require
, oruse
followed by...
.
- Allow
- #334 - Function separators - @KronicDeth
- Show a function separator (Preferences > Editor > General > Appearance > Show method separators) above the group of
@doc
,@spec
anddef
,defp
,defmacro
, anddefmacrop
(call definition clauses) of the same name and arity range. Arity range will be used if one of the call definition clauses uses default arguments.
- Show a function separator (Preferences > Editor > General > Appearance > Show method separators) above the group of
- #337 - @KronicDeth
@for
folds to the resolved module name indefimpl
@protocol
folds to the protocol name indefimpl
- #343 - Share code between
mix
andelixir
version parsing. - @KronicDeth - #344 - @KronicDeth
- Allow Unknown modulars in the Structure pane, in addition to Go To Symbol. Their icon is a big ? to indicate their correct usage is unknown.
- #348 - @KronicDeth
- Regenerate
gen
folder using Grammar Kit 1.4.1 and fix some bugs (including JetBrains/Grammar-Kit#126) manually.
- Regenerate
- #349 - Have both
QualifiedBracketOperation
andUnqualifiedBracketOperation
extendBracketOperation
, so thatBracketOperation
can be used to match both when the qualification does not matter. - @KronicDeth - #364 - @KronicDeth
-
Regenerate parser with GrammarKit 1.4.2
-
ElixirSdkRelease
is nowComparable
, so version checks can be done for tests to restrict them to Elixir 1.2+ for multiple alias support. -
Resolve Multiple Aliases with unqualified Alias in tuples.
-
canonicalName
borrows from the idea ofPsiReference#canonicalText
: an element can have both a Name (fromgetName
), which is the literal name in the code, which can be renamed, and a Canonical Name, which is the name to refer to the element without need for imports or aliases. For this change,defimpl
,defmodule
, anddefprotocol
will show their full module Alias for their Canonical Name.This change addresses the use case of Go To Declaration that should resolved to a nested
defmodule
.
-
- #330 - Check if
parameter
isnull
beforeVariable#execute
call inVariable#execute(PsiElement[], ResolveState)
. - @KronicDeth - #336 - Fix
isVariable
andvariableUseScope
forvar!(name)[...]
- @KronicDeth - #337 - @KronicDeth
@for
is no longer marked as unresolved indefimpl
and instead resolve to the either the<name>
infor: <name>
or the module name for the enclosing module whenfor:
is not given.@protocol
is no longer marked as unresolved indefimpl
and instead resolve to the<name>
indefimpl <name>
.
- #342 - @KronicDeth
- Instead of
assert checkRight || checkLeft
inMatch#processDeclaraions
, do the normal code ifcheckRight || checkLeft
and log an error report otherwise, so that the exact code that trigger this error can be reported and the method fixed to handle that form ofMatch
later.
- Instead of
- #343 - Be able to parse mix version from 1.3.0+ - @KronicDeth
- Check all lines of output for mix version as Elixir 1.3.0 changed the format of
mix --version
, so that it includes the Erlang header (Erlang/OTP ... [erts-...] [source] [64-bit] [smp:..:..] [async-threads:..] [hipe] [kernel-poll:false] [dtrace]
) on the first line andMix <version>
on the 3rd line. Previously the parsing expectedMix <version>
to be the first line.
- Check all lines of output for mix version as Elixir 1.3.0 changed the format of
- #344 - @KronicDeth
- If no known modular (Module, Implementation, Protocol, Quote, or Use) matches the call, then use Unknown, which accepts any macro with a
do
block or keyword. This allows Go To Symbol to no error in projects using Dogma asdefrule
is now treated as Unknown instead of causing an error that the enclosing modular could not be found.
- If no known modular (Module, Implementation, Protocol, Quote, or Use) matches the call, then use Unknown, which accepts any macro with a
- #349 -
BracketOperations
are neither parameters nor variables. - @KronicDeth - #353 - Fix stacktrace linking picking wrong file with same basename - @KronicDeth
- Strip spaces from front of file path in
mix
output, which allows file looks to work correctly. - Ensure file reference highlight doesn't include the leading and trailing characters by fix off-by-one errors.
- Strip spaces from front of file path in
- #358 - Determine whether to check left, right, or both by doing isAncestor checks for all operands, not just the normalized operand. The normalized operand is still used for
PsiScopeProcessor#execute
since#execute
is not expected to handle error elements. - @KronicDeth - #364 - @KronicDeth
- Add
A.{B, C}
to grammar with quoting to check consistence with Elixir 1.2. Ports elixir-lang/elixir#3666. - Use
fullyQualifiedName
instead ofgetName
forresolvableName
becausefullyQualifiedName
is needed so that qualified aliases inside of the{ }
of a multiple alias will not have a name asgetName
isnull
for those qualified aliases because the name fromgetName
has to be a literal name that can be renamed and qualified names can't be renamed.
- Add
- #365 - The
Module
icon got the same icon asUnknown
when creatingUnknown
somehow, I assume due to find-replace. - @KronicDeth
- #314 - Call references for unqualified no argument calls that work as variables or parameters - @KronicDeth
- Resolve and highlight parameter references
- Resolve call definition clause (
def(macro)?p?
) parameters to themselves - Resolve call definition parameter with default to itself
- Add Parameter ot Color Settings Page
- Parameters in any macro with do block or keyword pair
- Resolve call definition clause (
- Resolve and highlight variable references
- Properly identifier variable declared in
for
comprehension as variable - Add Variable to Color Settings Page
- Highlight bind quoted keyword key as Variable
- Resolve references to earlier
&&
operands, which handles code that matches a variable and only uses the variable on success like((cwd = cwd()) && write_tmp_dir(cwd))
- Resolve variables from
destructure
- Properly identifier variable declared in
- Detect bitstring segment options and don't treat them as variables.
- Highlight bitstring segment type options as Type, the same highlight as used for
@type
names. - Don't generate (unresolved) references for bitstring segment options
- Highlight bitstring segment type options as Type, the same highlight as used for
- Resolve
_
to only itself, no matter how many are used to reflect that it is non-binding, while_<name>
will resolve to_<name>
as it does bind.- Add Ignored Variable to Color Settings Page
- Reimplement module attribute renaming so that variable renaming can be implemented using a different validator for renaming (since module attribute names include the
@
). Non-inplace renaming should also be supported, but inplace is preferred. (There's a setting to turn off in-place renaming in JetBrains IDEs.) operation.infix.Normalized
- Normalizes leftOperand, operator, and rightOperand for an Infix operation that may have errors (in either operand). If there is an error in the operand then its normalized value is
null
.
- Normalizes leftOperand, operator, and rightOperand for an Infix operation that may have errors (in either operand). If there is an error in the operand then its normalized value is
- Keyword key type descriptions
- Default to
"keyword key"
. - Detect
bind_quoted:
usage and call those"quote bound variable"
.
- Default to
- Add interfaces to unify matching of
Matched
andUnmatched
form of operations when the code cares about the operatorAnd
UnaryNonNumericOperation
- Add
processDeclarations
to support variable and parameter resolution usingPsiTreeUtil.treeWalkUp
andPsiScopeProcessors
ElixirStabBody
- StabOperations
- Treat variables and parameters as
NamedElements
, so they can be Rename Refactored. - Move reused Module and Function names to
org.elixir_lang.psi.name.{Module,Function}
constants. - Parameter and Variable completion
- Resolve and highlight parameter references
- #318 - Highlight keyword keys (
key:
inkey: value
) that aren't quotes ("key": value
or'key': value
) as Atom. - @KronicDeth - #320 - @KronicDeth
- Show annotator applied highlights in the Preferences > Editor > Colors & Fonts > Elixir.
- Errors
Alias
Braces and Operators
Bit
(<<
and>>
)Braces
({
and}
)Brackets
([
and]
)Char Tokens
(?
)Comma
(,
)Dot
(.
)Interpolation
(#{
and}
)Maps and Structs
Maps
(%{
and}
)Structs
(%{
and}
when used for struct. The Alias is still highlighted usingAlias
)
Operation Sign
Parentheses
((
and)
)Semicolon
(;
)
Calls
Function
(currently only combined withPredefined
to highlightKernel
functions. Will be used later for all function calls once function references are implemented.)Macro
(curently only combined withPredefined
to highlightKernel
andKernel.SpecialForms
macros. Will be used later for all macro calls once macro references are implemented.)Predefined
(Combined withFunction
to highlightKernel
functions. Combined withMacro
to highlightKernel
andKernel.SpecialForms
macros.)
Escape Sequence
Module Attributes
Documentation
(PreviouslyDocumentation Module Attributes
)Text
(PreviouslyDocumentation Text
)
Types
Callback
(my_callback
in@callback my_callback() :: :ok
ormy_macro_callback
in@macrocallback my_macro_callback
)Specification
(my_function
in@spec my_function() :: :ok
)Type
typ
andinteger
in@type typ :: integer
parameterized
in@type parameterized(type_parameter) :: type_parameter
typtyp
in@opaque typtyp :: 1..10
typ
andtyptyp
in@callback func(typ, typtyp) :: :ok | :fail
binary
andutf8
in<< "hello" :: binary, c :: utf8, x = 4 * 2 >> = "hello™1"
Type Parameters
(type_parameter
in@type parameterized(type_parameter) :: type_parameter
)
Numbers
Binary, Decimal, Hexadecimal, and Octal Digits
(Previously at top-level.)Decimal Exponent, Mark and Separator
(Previously at top-level)Invalid Binary, Decimal, Hexadecimal, and Octal Digits
(Previously at top-level.)Non-Decimal Base Prefix
(Previously at top-level.)Obsolete Non-Decimal Base Prefix
Variables
Ignored
Parameter
Variable
- Recover in expression until close of subexpression
\n
\r\n
>>
]
}
)
;
->
end
after
catch
else
rescue
- Update Preferences > Editor > Colors & Fonts > Elixir example text's bitstring syntax to Elixir post-1.0.0 (Use
-
to separate segment options instead of a list.) - Use same algorithm for
ElixirStabBody
andElixirFile
because they are sequences of expressions. - Highlight atom keywords (
false
,nil
, andtrue
) as merge ofAtom
andKeyword
text attributes. If both only use foreground color,Keyword
wins. - Annotate
QualifiableAlias
asAlias
. - Highlight keyword list and map keywords (
<key>:
) asAtom
. - Add
with
to highlighted special forms
- Show annotator applied highlights in the Preferences > Editor > Colors & Fonts > Elixir.
- #322 - Additional Text Attributes - @KronicDeth
- Default text attributes for "Darcula" and "Default" themes: almost every Text Attribute Key has a unique hue for the Foreground color.
- Explain how to add
additionalTextAttributes
toplugin.xml
inCONTRIBUTING.md
- Group Textual Text Attribute Keys Together: Next "Textual" group is created and "Character List", "Escape Sequence", "Sigil", and "String" are moved under the group.
- Describe relations between different text attributes in
COLOR_SCHEMA_DESIGN.xml
, so they can be applied to different base schemes, such as applying the current Darcula additonalTextAttributes to Default.
- #314 - @KronicDeth
- Don't generate module attribute references for control attributes: Module attributes that control compilation or are predefined by the standard library:
@behaviour
,@callback
,@macrocallback
,@doc
,@moduledoc
,@typedoc
,@spec
,@opaque
,@type
, and@typep
, should not have references because their uses are unrelated. - Drop requirement that there are 2 children and only require there be 1 and assume that is the Operator.
- Don't count @(...) as a module attribute usage: Module attribute declarations are defined as
defmacro @(...)
in Kernel and that@
should count as a function name, not a prefix for a module attribute name. - Allow
null
Module for Scratch File use scope - Default to
"call"
for Call type - Fix typo that had
*Two
operations usingType
interface - Don't process
AccessExpression
declarations
- Don't generate module attribute references for control attributes: Module attributes that control compilation or are predefined by the standard library:
- #316 - @KronicDeth
- Highlight
foo
in@spec foo
as a type, which occurs while typing a new@spec
before::
can be typed. - Check if
leftOperand
isnull
even whencheckLeft
istrue
becausecheckLeft
can betrue
andleftOperand
isnull
when thelastParent
is the operand or operation as a whole, but there is an error in the unnormalizedleftOperand
leading to the normalizedleftOperand
beingnull
. - Check if reference is
null
before checking if it resolves tonull
when replacing module attribute usages with their value becauseAtNonNumericOperation
s can have anull
reference when they are non-referencing, like@spec
.
- Highlight
- #317 - Leave normal highlighting for char tokens when highlighting types - @KronicDeth
- #320 - @KronicDeth
- Stab operation parameter Use Scope is the stab operation.
- Skip over
PsiLeafElement
when looking for variables because thePsiLeafElement
is an error. - In a script file where the parent of a
Match
is aPsiFile
, theMatch
Use Scope is the rest of the file. - Add
=
toOperator Signs
- Skip
NoParenthesesKeywords
when highlighting types, which occurs when the::
has no proper right operand and the following one-liner function clause withdo:
is parsed as the right operand. - Skip
DUMMY_BLOCK
when looking for Variable, which prevents walking through errors. - Use
Normalized
pattern forPrefix
, so that the operand isnull
when only the operator matches or the operand has errors. - Work-around Phoenix .ex templates that contain EEX: if
<%=
from EEX is detected, don't throw error whenModular
can't be found. - Fix capitalization error in example text
- #323 - Build
jps-builder
using only Java 1.6 compatible.class
es - @KronicDeth-
In IntelliJ 14.1, all of
openapi.jar
targets Java 1.6 (withMAJOR.MINOR
50.0
), but in IntelliJ 2016.1, some ofopenapi.jar
targets only Java 1.8 (withMAJOR.MINOR
52.0
), sincejps-builders
require parts ofopenapi.jar
and must target Java 1.6 even for IntelliJ 2016.1, the52.0
.class
es needed to be ported intoorg.elixir_lang.jps.builder
, so that the52.0
version inopenapi.jar
wouldn't be attempted to be loaded.This ended up being 5 classes:
ExecutionException
GeneralCommandLine
ParametersList
ParamsGroup
ProcessNotCreatedException
Only
GeneralCommandLine
was used directly, all others are dependencies of it.
-
- #320 - @KronicDeth
- Preferences > Editor > Colors & Fonts > Elixir restructured to group together related highlights and to match grouping used for Colors & Fonts > Language Defaults and Colors & Fonts > Java.
Documentation Module Attributes
renamed toModule Attributes
>Documentation
Documentation Text
renamed toModule Attributes > Documentation > Text
Expression Substitution Mark
renamed toBraces and Operators > Interpolation
.- The following are now nested under
Numbers
instead of being at the top-level:Binary, Decimal, Hexadecimal, and Octal Digits
Decimal Exponent, Mark and Separator
Invalid Binary, Decimal, Hexadecimal, and Octal Digits
Non-Decimal Base Prefix
Obsolete Non-Decimal Base Prefix
- Preferences > Editor > Colors & Fonts > Elixir restructured to group together related highlights and to match grouping used for Colors & Fonts > Language Defaults and Colors & Fonts > Java.
- #322 - "Character List", "Escape Sequence", "Sigil", and "String" are moved under the new "Textual" group. - @KronicDeth
- #324 - Group Numbers subcategories and lower display name verbosity - @KronicDeth
- "Numbers > Binary, Decimal, Hexadecimal, and Octal Digits" renamed to "Numbers > Digits > Valid"
- "Numbers > Invalid Binary, Decimal, Hexadecimal, and Octal Digits" renamed to "Numbers > Digits > Invalid"
- "Numbers > Non-Decimal Base Prefix" renamed to "Numbers > Base Prefix > Non-Decimal"
- "Numbers > Obsolete Non-Decimal Base" renamed to "Numbers > Base Prefix > Obsolete > Non-Decimal"
- #287 - Use the error reporter logger instead of plain
assert
inPrefix#operator
. NOTE: This does not address error recovery recovery since I don't have a regression test case. - @KronicDeth - #283 - All function name elements act as
PsiNameIdentifier
s now even if they don't resolve, but that means they all need to supportFindUsagesProvider#getType
, which they don't, so use a placeholder of "unknown call type" for anyCall
that can't be matched and "unknown element" for anything else. - @KronicDeth - #284 - Enumerate all Kernel Functions, Macros, and Special Forms in the Syntax Highlighting section of the README, so that users searching for which category controls highlighting a given call can find it. - @KronicDeth
- #257 - @KronicDeth
- Go To Symbol (⌥⌘O)
- Call definition clauses (
def
,defp
,defmacro
, anddefmacrop
) - Callbacks (
@callback
and@macrocallback
) - Call definition specifications (
@spec
) - Call definition heads (
foo(bar)
) for delegation (defdelegate foo(bar), to: BAZ
) - Implementations (
defimpl
) - Protocols (
defprotocol
)
- Call definition clauses (
- Go To Declaration for Aliases now uses the same
isModular
checks as the stubbing for the index uses for Go To Symbol.
- Go To Symbol (⌥⌘O)
- #263 - Build against 14.0, 14.1, 15.0, and 2016.1 on travis-ci to ensure continued compatibility. - @KronicDeth
- #273 - Error reporting for type highlighter gives the Class, Excerpt and Full Text when an unknown element type is encountered as the Excerpt alone is not enough sometimes. - @KronicDeth
- #275 - @KronicDeth
- Custom error handling that will open an issue against https://github.com/KronicDeth/intellij-elixir with the exception messsage and stacktrace filled in.
- Changed
NotImplementedExceptions
and (some)assert
s to logging custom error message that include thePsiElement
text and the containing file as an attachment. The files make the URL too big for the error handler to put the file contents in when opening the browser with the error handler, so the issue body instead explains how to get the attachment text out of IntelliJ's "IDE Fatal Errors"
- #276 - Update to Grammar Kit 1.3.0. - @KronicDeth
- #256 - Fix Elixir Mix Run configuration not persisting past restart - @zyuyou
- #259 - Allow
Infix#operator
to work on operations with errors, which eliminates theAssertionError
reported when typing infix operation and they are incomplete - @KronicDeth - #259 - Add Keywords to the Preferences > Editor > Colors & Fonts > Elixir settings page, so it can be customized for just Elixir instead of having to change Preferences > Editor > Colors & Fonts > General > Keyword - @KronicDeth
- #263 - Ensure compatibility from 14.0 to 2016.1 - @KronicDeth
-
Use
TextAttributesKey
s that aren't deprecated in 2016.1 and work back to 14.1All of
CodeInsightColors
is deprecated, so all constants from there had to be replaced. Unfortunately, the recommended replacements don't have the same color as the original, so I used differentDefaultLanguageHighlighterColors
constants for some."Module Attribute" is now based on
DefaultLanguageHighlighterColors.CONSTANT
(which is purplish in Darcula) instead of the recommendedMETADATA
, which is yellow. Although module attributes don't have to be constant since they can be set to accumulate, often they are used as constants and not really as metadata, since they are just data then. All themetadata
uses of module attributes have a separate color."Specification" is now based on
DefaultLanguageHighlighterColors.FUNCTION_DECLARATION
, which maintains the golden color thatCodeInsightColors.METHOD_DECLARATION_ATTRIBUTES
had."Type" is now based on
DefaultLanguageHighlighterColors.METADATA
, which is bright yellow unlikeCodeInsightColors.ANNOTATION_ATTRIBUTE_NAME_ATTRIBUTES
, which was a bright white."Type Parameter" is now based on
DefaultLanguageHighlighterColors.PARAMETER
, which unfortunately has no attributes associated with it, but the constant name was too good a fit not to use, so if you want the old color, you'll need to customize it yourself. -
Restore compatibility with the IntelliJ IDEA 14.0 release line
- By using reflection to call
FileTemplateManager#getInstance
ifFileTemplateManager#getDefaultInstance
is not available - By calling
FileChooserDescriptorFactory#createSingleLocalFileDescriptor
(which works in 14.0 through 2016.1) instead ofFileChooserDescriptorFactory#createSingleFileDescriptor
(which only works in 14.1 through 2016.1)
- By using reflection to call
-
- #264 - Use more human-readable error message for Elixir File action - @KronicDeth
- Instead of showing the regular expression pattern, which may be confusing to new developers, explain in English the expected pattern. I also included the description, which explains how nesting is mapped to directories, of the action since it doesn't actually show up in the dialog otherwise.
- #265 - Check if a file exists before allowing Elixir Module to be created. If it exists, show an error with the conflicting path. - @KronicDeth
- #272 - Fix (one cause) of
AssertionError
inGoToSymbolContributor
when theModular
(defimpl
,demodule
,defprotocol
, andquote
) could not be resolved due adef
being surrounded by afor
comprehension, which is common in Elixir libraries as was the case forPostgrex
: any enclosingfor
comprehension(s) will now be ignored and the next enclosing macro will be checked to see if it is aModular
. - @KronicDeth - #273 - While typing, before
:
in keyword pairs, after thewhen
, such as in@spec foo(id) :: id when id
before finishing typing@spec foo(id) :: id when id: String.t
, the keyword key will be properly highlighted as a Type Parameter - @KronicDeth - #276 - @KronicDeth
- Properly handle the
Infix#rightOperand
beingnull
due to the Pratt Parser matching up through the operator and then ignoring the mismatched right operand, which leads to theInfix
having only 2 elements: the left operand and the operator. @doc
and other module attributes appearing as the right operand of@type name ::
will be ignored as it is common when adding a new type above pre-existing, documented functions.- Only error in
Infix#leftOperand
if there are not 2-3 children forInfix
instead of a strict 3.
- Properly handle the
- #276 - Drop support for IntelliJ 14.0 because the parser generated by Grammar Kit 1.3.0 is not compatible with the OpenAPI libraries shipped in IntelliJ 14.0. Still compatible with 14.1 through 2016.1. - @KronicDeth
- #240 - Code Commenter - qertoip
- #243, #248 - Structure View - KronicDeth
- Controls
- Scroll to Source and Scroll From Source
- Sorting
- Runtime (functions) vs Compile (macros)
- Visibility (public [
def
,macro
, etc] vs private [defp
,macrop
and@typep
]) - Alphabetical
- Show Used - injects structure from
use Alias
call's__using__
'squote
into the call site Structure
- Elements
- Callbacks (
@callback
) show their name/arity and then a nest spec - CallDefinition groups together CallDefinitionClause of the same name/arity
- CallDefinitionClause (
def
,defp
,macro
, andmacrop
) shows the head of each definition under the CallDefinition. - CallDefinitionSpecification (
@spec
) show the type specification for a CallDefinition - CallReference
name: arity
shows the name/arity for adefoverridable
. - Delegation shows all the
:append_first
and:to
options with the implied Function Delegation nested underneath - Exception (
defexception
) show the implicit struct and nest any callback functions, such asexception/1
ormessage/1
. - Overridable
defoverridable
tracks overridable functions and is used to mark CallDefinitions are overrides. - Quote
quote do end
models quote blocks so they can be injecteduse Alias
sites. - Use
use Alias
showuse
calls.
- Callbacks (
- Controls
- #241 - Live Templates - pfitz
- #220 - Added clarification to "Import Project from External Model" that
mix.bat
should be used instead ofmix
- f-lombardo - #244 - Get the Elixir version directly from
System.build_info[:version]
instead of processing the formatted output ofelixir --version
as the build info version is more stable - KronicDeth
- #244 - Elixir version parsing handles both pre and build numbers if present by using the same regular expression as Elixir itself uses for the
Version
module - KronicDeth - #245 - Better error handling in Structure View - KronicDeth
- #236 -
\u
in strings and char lists for unicode mapping - KronicDeth - #237 - Test against Elixir 1.1.1 and 1.2.0 - KronicDeth
- #233 - More flexible
elixir --version
parsing: works withelixir
1.2.0 and earlier - bitgamma
- #207 - KronicDeth
- Highlighters for
- Kernel Functions
- Kernel Macros
- Kernel.SpecialForms Macros
- Highlighters for
- #219 - Test against Elixir v1.1.1 - KronicDeth
- #221 - Highlight
after
,catch
,do
,else
,end
,fn
, andrescue
as keywords - KronicDeth - #223, #227 - Annotate Module Attributes - KronicDeth
- Documentation module attributes (
@doc
,@moduledoc
, and@typedoc
) are annotated as "Documentation Module Attributes" while all other module attributes are annotated as "Module Attributes". - The string or heredoc argument to a documentation module attribute (
@doc
,@moduledoc
, and@typedoc
) is annotated as "Documentation Text" - Function names passed to
@callback
,@macrocallback
or@spec
are annotated as "Specification". - Variables/calls in the parameters and return of
@callback
,@macrocallback
,@spec
are annotated as "Type". - Parameters of
@opaque
,@type
,@typep
names are annotated as "Type Parameter" - Keyword keys from the
when
clause of@callback
,@macrocallback
or@spec
definitions and their usage are annotated as "Type Parameters" @doc false
,@moduledoc false
, and@typedoc false
will annotate thefalse
with a weak warning: "Will make documented invisible to the documentation extraction tools like ExDoc.".
- Documentation module attributes (
- #228 - Module attributes resolution and refactoring - KronicDeth
- Go To Definition for module attributes.
- Module attribute completion (NOTE: works after typing first character after
@
. To see all module attributes, type a character after@
, then delete the character to get the full list.) - Module attributes that can't be resolved will have "Unresolved module attribute" error annotation (i.e. red squiggly underline).
- Find Usages of module attributes from their declarations.
- Rename module attributes inline (editing the name in the declaration will change the name at the usage site at the same time without a dialog).
- The module attribute value (from the declaration site) will be folded into the usage site. It can be reverted to the literal
@module_name
text by clicking the + to unfold.
- #206 - Change "edition" to "addition" in README. - folz
- #225 - Sped up reparsing when [ENTER] is hit in the middle of comment by removing the custom error handling element, adjacentExpression, and going with the default error handling provided by JetBrains' OpenAPI. - KronicDeth
- #226 - Fix
mix
version detection on Windows - KronicDeth
- #225 - KronicDeth
- Removed "Add Newline" Quick Fix as it depended on
adjacentExpression
elements, which have now been removed to speed up error handling when comments become code. - Removed "Add Semicolon" Quick Fix as it depended on
adjacentExpression
elements, which have now been removed to speed up error handling when comments become code.
- Removed "Add Newline" Quick Fix as it depended on
- #204 - Keywords not at the end of no parentheses calls will be properly marked as errors. - KronicDeth
- #200 - Fix
IllegalStateException
for file delete and rename by givingElixirFile
s descriptive names for safe-refactoring displaying file usage. - KronicDeth - #201 - KronicDeth
- README states explicitly that the plugin works with both IntelliJ Community and Ultimate.
- README states that the plugin is free.
- #202 - Prevent match error when typing
~
to start a sigil that is followed later by a\n
by matchingEOL
in theNAMED_SIGIL
state as aBAD_CHARACTER
- KronicDeth - #204 - Keywords at the end of a no parentheses call that is surrounded by parentheses will not be marked as an error when that parenthetical group appears in the middle of an outer call. - KronicDeth
- #184 - If (1) you have intellij-erlang installed and (2) you have an atom in Erlang that starts with
Elixir.
, such as'Elixir.Test'
, then intellij-elixir will annotate whether it can resolve the name to adefmodule
call in Elixir files. - KronicDeth - #188 - Default SDK path for Linux and Windows - zyuyou
- #198 - KronicDeth
- Go To Declaration (
Cmd+Click
,Cmd+B
,Navigate > Declaration
) from Alias todefmodule
where Alias is declared. - Index
defmodule
s for fast Go To Declaration in elixir-lang/elixir and other large projects. - Find Usage for Alias in
defmodule
- Go To Declaration (
- #167 - zyuyou
Build
Compile
an individual fileMake Project
to build the entire project
New
Elixir File
has new templatesEmpty module
Elixir Application
Elixir Supervisor
Elixir GenServer
Elixir GenEvent
Project > Elixir
creates a new Elixir project with an emptylib
directory marked as source directory.Project from Existing Sources...
Create project from existing sources
sets up the project with SDK using a pre-existing directory.Import project from external model > Mix
- Fetches the the dependencies with the local version of
mix
- Marks
lib
directory as source - Marks
test
directory as test sources
- Fetches the the dependencies with the local version of
Run > Elixir Mix
to setup Run Configurations to runmix
tasks.
- #168 - Update ant build on travis-ci.org to use IDEA 14.1.4 (from 14.0.2) - KronicDeth
- #174 - Parser is verified to quote the same as native Elixir - KronicDeth
- #154 - Fix parsing of unary vs binary +/- with leading and trailing spaces and newlines - KronicDeth
- #155 - Allow EOL between list arguments and
]
- KronicDeth - #156 - KronicDeth
- Relative identifiers after
.
that start withand
,or
, andnot
will be lexed as a single identifier instead ofand
,or
, ornot
followed by another identifier. end
is allowed as a relative identifier after.
- Relative identifiers after
- #157 - Fix
(...)
as part of matched expression in no parentheses stab signature - KronicDeth - #158 - Allow multiple newlines to mark the end of an expression, but only one
;
- KronicDeth - #159 - Allow operators in function references (
<op>/<arity>
) for function captures (&<op>/<arity>
) - KronicDeth - #160 -
unquote_splicing
is properly wrapped in__block__
when in stab bodies - KronicDeth - #163 - Check for matching terminator in heredocs when determining white space type at beginning of line - KronicDeth
- #170 - Allow + to count as addition - KronicDeth
- #171 - Unary expressions inside parentheses are no longer marked
ambiguous_op: nil
- KronicDeth - #173 - Differentiate between
Qualifier.'relative'()
vsQualifier.'relative' ()
andQualifier."relative"()
vsQualifier."relative" ()
- KronicDeth - #176 - Fix link to Elixir website in README - shalecraig
- #178 - All tokens have human-readable names and/or expected characters for better error messages - KronicDeth
- #162 - New Elixir File has moved to the last item in the New File menu to preserve
CTRL+N ENTER
keyboard shortcut forNew > File
- jaketrent
- #135 -
do
blocks (`do end) - @KronicDeth - #152 - Unmatched expressions (operations involving
do
block calls and normal matched expressions) - Kronicdeth
- #137 - Lex full atom instead of just identifier-like operator prefix (
:in<nospace>dex
before vs:index
after) - @KronicDeth - #138 -
!
andnot
are properly wrapped in__block__
s when in stab bodies - @KronicDeth
- #126 - Bracket at expression (
@foo[key]
) - @KronicDeth - #127 - Anonymous functions (
fn end
), stab clauses (->
), and parentheticals ((1 + 2)
) - @KronicDeth - #128 - Maps (
%{}
) and structs (%User{}
) - @KronicDeth - #129 - Tuples (
{}
) - @KronicDeth - #130 - Bit strings (
<<>>
) - @KronicDeth
- #122 - @KronicDeth
- Remote function calls (
Alias.function
,:atom.function
, etc) and local function calls (function
) with...- No Parentheses with...
- No Arguments (
Alias.function
) - Keywords (
Alias.function key: value
) - Nested No Parentheses Call (
Alias.function Inner.function positional, key: value
) - Positional and Keyword arguments (
Alias.function positional, key: value
) - Matched Expression (
Alias.function 1 + 2
)
- No Arguments (
- Parentheses with...
- No arguments (
Alias.function()
) - No Parentheses Call (
Alias.function(Inner.function positional, key: value
) - Keywords (
Alias.function(key: value)
) - Positional and Keyword arguments (
Alias.function(positional, key: value)
) - Trailing parentheses for quoting (
def unquote(variable)(positional)
)
- No arguments (
- No Parentheses with...
- Remote function calls (
- #125 - Bracket expression (
foo[key]
) - @KronicDeth
- #121 - Fix
NoSuchElementException
when no suggested SDK home paths are available. Thanks to @zyuyou for reporting - @KronicDeth
- #112 - File > New > Project From Existing Sources can be used in IntelliJ to setup the excludes, sources, tests, SDK and libraries for an Elixir project that has already been created with
mix new
. - @KronicDeth - #114 - Operators can be qualified function names - @KronicDeth
- #118 - @KronicDeth
- Anonymous function calls (
.(...)
) - Inspection that marks errors when keywords aren't at end of list.
- Anonymous function calls (
- #108 -
\x
is marked as an error in CharLists, CharList Heredocs, Strings, and String Heredocs, but not in any sigils. - @KronicDeth - #111 - New Elixir File will automatically underscore the camel case module name when creating the file name and will convert qualifying aliases before the last
.
to directories - @KronicDeth
- #111 - New Elixir File validates that the name is a valid Alias, so each
.
separated part must start with a capital letter. Previous New Elixir File validated that the name was a valid path, and so forced the name to be lowercase. - @KronicDeth
- #105 - No parentheses function calls can occur as the right operand in binary infix operations or the sole operand of unary prefix operation. - @KronicDeth
- #74 - @KronicDeth
- Function calls with neither parentheses nor
do
blocks that have at least 2 arguments: a positional argument and keyword arguments or 2 or more positional argument(s) followed by optional keyword arguments. - Inspection that marks errors for ambiguous commas
- Inspection that marks errors for ambiguous parentheses
- Quick Fix for the ambiguous parentheses to remove the space between the function name and the opening parentheses.
- Function calls with neither parentheses nor
- #75 - @KronicDeth
- Inspection that marks errors for missing end-of-expressions (
;
and newlines) between expressions. - Quick Fix to insert
;
for missing end-of-expression. - Quick Fix to insert newline for missing end-of-expression.
- Inspection that marks errors for missing end-of-expressions (
- #74 - Right hand-side of
dot_alias
anddot_identifier
was translated incorrectly. Only Aliases and Identifiers are allowed now. @KronicDeth
- #73 - @KronicDeth
- New attributes for parts of numbers on Color Settings Page
- Binary, Decimal, Hexadecimal, and Octal Digits
- Decimal Exponent, Mark, and Separator
- Invalid Binary, Decimal, Hexadecimal, and Octal Digits
- 2-9, A-Z, and a-z will be parsed as invalid binary digits
- 8-9, A-Z, and a-z will be parsed as invalid octal digits
- G-Z and g-z will be parsed as invalid hexadecimal digits
- Non-Decimal Base Prefix
- Any letter other than b, o, or x, in either case, will be recognized as an invalid whole number base
- Obsolete Non-Decimal Base Prefix (
B
for binary andX
for hexadecimal)
- Any digit, 0-9, A-Z, or a-z will be parsed as invalid for invalid whole number based numbers
- Recovery for non-decimal whole numbers if the prefix is given, but no digits are given
- #73: Number attribute has been removed from Color Settings page - @KronicDeth
- #17: All valid escape sequences (
\<character>
,\x<hexadecimal>
,\x{<hexadecimal>}
are recognized. - @KronicDeth - #18: Support for creation of Elixir modules - @abaire
- #21: Use pygments' elixir_example.ex supplied by @alco for Color Settings Page - @KronicDeth
- #25:
?
before any character or valid escape sequence will be recognized as a character token. - @KronicDeth - #35:
;
is recognized as EOL.\r\n
and\n
style EOL can be escaped with\
and will be treated as whitespace. - @KronicDeth - #38: Operator arity, associativity, and precedence - @KronicDeth
- #39: Decimal integers and floats - @KronicDeth
- #40: Identifiers (variable, function, and macro names) - @KronicDeth
- #41:
...
identifier - @KronicDeth - #42: Aliases (module names) - @KronicDeth
- #45: Keyword identifiers - @KronicDeth
- #49: Empty Parentheses - @KronicDeth
- #52: In Operator - @KronicDeth
- #54: Dot Operator - @KronicDeth
- #56: Keyword Lists - @KronicDeth
- #70: Matched Expressions - @KronicDeth
- #72: Regular Keywords (
end
,false
,fn
,nil
, andtrue
) - @KronicDeth
- #17: Sigil terminator escapes are recognized, so that sigils are no longer prematurely terminated. - @KronicDeth
- #24: Comments do not consume EOL, so trailing comments don't cause error parsing expression on following line. - @KronicDeth
- #36: Sigil modifiers now work on groups in addition to heredocs. - @KronicDeth
- #47:
;
is separate fromEOL
and either or both can separate expressions, but onlyEOL
can separate operators and operands for operations - @KronicDeth
- #10: Blank lines are properly parsed as whitespace instead of bad characters. - @KronicDeth
- #13: EOL is parsed as bad character in sigil name (after
~
) instead of causing the lexer to fail to match, which raised exceptions in Event Log. - @KronicDeth
- Atoms with highlighting
- Atom with double or single quotes to allow interpolation. Double quotes are highlighted as 'String' while single quotes are highlighted as 'Char List'. This may be changed in the future.
- Literal atoms highlighted as 'Atom'.
- Operator atoms highlighted as 'Atom'.
- Build using JDK 6 instead of 7 so that plugin will work by default on OSX Mavericks.
- #3: Literal and interpolated sigils with highlighting - @KronicDeth
- CharList Sigils (
~c
and~C
) highlighted as 'Char List' in Settings. - Regex Sigils (
~r
and~R
) highlighted as 'Sigil' in Settings. NOTE: Regex syntax is not internally highlighted yet - String Sigils (
~s
and~S
) highlighted as 'String' in Settings. - Word Sigils (
~w
and~W
) highlighted as 'Sigil' in Settings. - Custom Sigils highlighted as 'Sigil' in Settings.
- Modifiers are highlighted on Regex, Word, and Custom while modifiers aren't allowed on CharList and String Sigils.
- CharList Sigils (
- Single-quoted strings are correctly referred to as 'Character List' now instead of 'String' in Settings.
- Double-quoted strings are correctly referred to as 'String' now instead of 'Interpolated String' in Settings.
- Non-Heredoc CharLists and Strings can be multiline.
- CharLists and Strings support interpolation and escape sequences.
- Single quoted strings with highlighting. ('String' in Color Settings.)
- Double quoted strings with highlighting. ('Interpolated String' in Color Settings.)
- Interpolation (
#{
and}
) with highlighting. ('Expression Substitution Mark' in Color Settings.) - Escape sequences for
"
and#
with highlighting. ('Escape Sequence' in Color Settings.)
- Interpolation (
- Binary, Hexadecimal, and Octal numbers (including deprecated syntax) are recognized as numbers.
- Syntax Highlighting for numbers.
- Color Settings page for changing the color of comments and numbers for Elixir (Preferences > Editor > Colors & Fonts > Elixir).
- Parser no longer freezes IDE on tokens it doesn't understand.
- White space at beginning of lines no longer leads to annotation errors.
- White space and EOLs at beginning of file no longer lead to annotation errors.