Bot releases are hidden (Show)
Published by KronicDeth 10 months ago
Changelog
displayName
in plugin.xml
for configurables for faster menu loading.
org.elixir_lang.facet.configurable.Project
- "Elixir"org.elixir_lang.facets.sdks.erlang.Configurable
- "Internal Erlang SDKs"org.elixir_lang.facets.sdks.elixir.Configurable
- "SDKs"Published by KronicDeth about 1 year ago
Cell.horizontalAlign(HorizontalAlign)
Call.align(AlignX.FILL)
.group:
for docs.findModuleForPsiElement
in mostSpecificSdk
in read action.mix.exs
for OTP apps if it can't be read.mix new
stderr in IOException
for better triage.mix new
stderr in IOException
for better triage.org.apache.commons.lang.SystemUtils
instead of org.codehaus.plexus.interpolation.os.Os
to detect if on Windows for Test marker file URL.FileIndex.getContentRootForFile
in ReadAction
when getting working directory for mix format
.null
target usage types when finding usage type across all targets..elixir_ls
directory when configuring new Project
s..elixir_ls
directory is included the .beam
it produces can interfere with normal StubIndex
.prependingQualifiers
at EEx tags.When configuring an SDK, if you don't want to use the suggested SDK home path, you'll need to know where each package manager puts Elixir and Erlang.
Published by KronicDeth over 1 year ago
FIX
version of 174
, which is less than IntelliJ's 175
in IntelliJ 2023.1's builder number, 231.8109.175
.Published by KronicDeth over 1 year ago
from
, don't error on unknown keys if any previous key was preload as this may be a list of preloads that is missing the square brackets.com.intellij.modules.java
plugin.Published by KronicDeth over 1 year ago
TODO()
in leex.reference.resolver.Assign
with logger errors that include PSiElement
.type
for docs.syncLibraries
.mix format
if it has an Erlang SDK.@*doc
attribute isn't quoted.And
as Elixir and
.request_body
and responses
for docs.sinceBuild
to IntelliJ IDEA 2022.3.minByOrNull
to protect from empty module list.minBy
was what was throwing the NoSuchElement
exception.null
operands for not in
primaryArguments()
.mix new
.unquote
calls when injecting docs.quote
when def
s are inside an fn
as in Phoenix Route Helpers.functionNameElement
is the def
, defp
, defmacro
, or defmacrop
and so both the name of the call was changed, but the def*
was also changed to the new name. Now, if setName
is called on a definition, the head is renamed instead.mix
commandline.Keep looking for variants above if and unless
if
and unless
used to call keepProcessing()
after checking if the child calls when resolving or searching for variants, but Variants returned false
always from keepProcessing()
.
This stops the variant search from terminating inside of an if
or unless
when it wouldn't outside of one as was reported in #2751.
List Kernel
and Kernel.SpecialForms
variants inside modulars.
Keep processing at end of modulars when looking for variants, which will check the implicit imports of Kernel
and Kernel.SpecialForms
.
Prevent listing variants from outer module in nested module
mix new
errors as notifications
--app
is set correctly for new projects
mix new
does.--app
is set explicitly, make sure it follows naming rules for mix new
.Published by KronicDeth almost 2 years ago
Published by KronicDeth about 2 years ago
PsiErrorElement
when collecting doc comments.authors: ...
for documentation when injecting Markdown.prependQualifiers
when reaching a qualified bracket operation (Alias.function[key]
).-1
and other unary operations when resolving types.emptySequence
from childExpressions
when PsiElement
has no firstChild
or lastChild
.@moduledoc File.read!(Path.join([__DIR__, "..", "README.md"]))
ancestorTypeSpec
on QualifiedMultipleAliases
.warn_missing
in edeliver
's distillery
dep.Published by KronicDeth about 2 years ago
@moduledoc
, @typedoc
, and @doc
@doc deprecated: ...
false
for documentation module attributes@doc
metadata that can't include Markdown
guard: ...
since: ...
@callback(unquote(spec))
when trying to find typespecs...>
as Markdown since it's not Elixir syntax** (...
as Markdown since it's not Elixir syntax for exception in iex promptsiex>
as Markdown since it's not Elixir syntaxMODULE
c:NAME/ARITY
)c:MODULE.NAME/ARITY
)t:NAME/ARITY
)t:MODULE.NAME/ARITY
)NAME/ARITY
)MODULE.NAME/ARITY
)@doc
above @callback
and @macrocallback
)@typedoc
above @type
, @typep
, and @opaque
)**
.Documentation in @moduledoc
, @typedoc
or @doc
module attribute values are marked as Markdown language, so that the JetBrains supplied Markdown support works in documentation.
Code in code blocks (indented 4 spaces) are marked as Elixir language, so all the normal language support works in code examples and doctests.
This includes highlighting reads and writes of variables
and Go To Definition for calls
Markdown documentation in @moduledoc
, @typedoc
or @doc
can be toggled back and forth from the editable Markdown view and the rendered HTML view.
In the rendered view, aliases are clickable and navigatable.
Clicking the links will show the documentation for module.
Using Go To Definition (Cmd+Click) on the link will take you to the module definition.
You can get documentation for functions and macros that have a @doc
, aliases of modules that have a @moduledoc
or types that have a @typedoc
in a pop-up using Quick Documentation.
Place the cursor over the name of callback being referneced.
Display the documentation with either:
@doc
@doc
@moduledoc
Place the cursor over the name of a type being used.
Display the documentation with either:
@typedoc
Published by KronicDeth over 2 years ago
IOException
s swallowed by Project Initialization Failed.mix new
..idea
directory is written when setupProject
is called differs between IDE versions, so to be safe, recursively delete.ModuleImpl
did not have processDeclaration
overloadded, so the PsiScopeProcessor
was never called on it and so the CallDefinitionClause
scope processor did not check the ModuleImpl#callDefinitons
.SDK
sdkAdditionalData
is non-null
.ModuleType
say the concept is meant to be deprecated, so don't enforce it and trying to load ElixirModuleType
in RubyMine breaks as it tries to load ElixirModuleBuilder
and therefore JavaModuleBuilder
, which only works in IntelliJ.SUSPECT_NAME_SET_SIZE
to 20
.15
impl
s of String.Chars
in the geo
hex package.erl
binary is not found when trying to run mix format
.Published by KronicDeth over 2 years ago
originalFile
when calculating path, so that .beam
file path is used for decompiled files that don't have a VirtualFile
.<details>
with <summary>
gradle
to 7.4.2
gradle-intellij-plugin
to 1.6.0
-Xjvm-default=all
for Kotlin to allow @JvmDefault
interfaces
LanguageNewProjectWizard
subclasses and associated implementations--app
--module
--sup
--umbrella
mix format
external formatter.mix format
works at the file-level.
Allow mix format
external formatter to be disabled.
mix format
tabmix format
".null
containingFile
when fetching docs.AlreadyDisposedException
when trying to find module for PsiElement in mostSpecificSdk
.
is disposed before using it to get module for
PsiElement`.CallDefinitionImpl
for Type
scope processingModuleImpl
to find the TypeDefinitionImpl
.Mix.commandLine
used for Run Configurations.
<variable>.<tuple>
for ancestorTypeSpec
.
<tuple>
after <variable>.
for ancestorTypeSpec
.TypeDefinitionImpl
@<module_attribte> <name>(<parameters>) :: ...
name
type
TypeDefinitionImpls
to types in decompiled source.TypeDefinitionImpl.getNavigation
to go to decompiled types.RuntimeException
if rootProvider
is already disposed.AssertionError
used to be enough in #1359, but not anymore as of #2623.@type name :: String.()
@type String.()
@type S
!
when converting from equals
to ==
when fixing the deprecation warnings, which made the Project SDK selection only be HIDDEN where it needed to be SHOWN.StackOverflowError
in find_usages.Provider.getType()
.CallDefinitionImpl
CallDefinitionImpl
references as predefined if resolved CallDefinitionImpl
is in Kernel
or Kernel.SpecialForms
.def
and other defined when using SDKs without source like Homebrew after the delayed-decompilation fixes from 12.2.1. Now source-less (Homebrew) and SDKs with sources (ASDF) will both be able to highlight predefineds.Sdk.rootProvider
by reloading the Sdk
when loading ebinDirectories
ModuleType.getBuilder
ModuleBuilder
s as potential project builders, so it looked like Elixir New Project support disappeared. Fix this by implementing the newProjectWizard.language
extension that was added to control the Language switching in the new New Project dialog.ElementClassHint
in BeamFileImpl that only work in IntelliJ.ElementClassHint
is part of the processDeclaration
system used in Java and so was in the code because BeamFileImpl
was original based on ClassFileImpl
, but since the Elixir resolvers don't use the hint system at all, it can just be removed.CodeStyleSettingsProvider
because it is redundant with LanguageCodeStyleSettingsProvider
UsageTargetProvider
to ElixirFile
senv
from the Configuration
was dropped because a local env
was created to set MIX_ENV
true
.If you'd like to run mix credo
use can run it as a global Inspection.
IntelliJ Elixir both has an internal formatter used to format new linees and parts of files, but also can use mix format
to format entire files.
IntelliJ Elixir's internal formatter can reformat code to follow a consistent style.
mix format
)IntelliJ Elixir will run mix format -
on the text of the file. As mix format
works on entire files, only whole
file, multiple file, or directory formatting is supported using this external formatter. Formatting subsections and
new lines use the internal formatter until the next full file format uses mix format
.
NOTE: The module or project SDK MUST be set in order to run mix format
. If the SDK is not set, only the internal formatter will be run.
mix format
can be disabled if you only want to use the Internal Formatter.
mix format
tabmix format
".To tun on format on save:
JetBrains IDEs have autosave turned on by default when you click away from the editor window, but you can adjust the settings:
All files in a directory can be reformatted using the External Formatter (mix format
)
All lines in a file can be reformatted with the External Formatter (mix format
).
All the lines in the current editor tab file can be reformatted with External Formatter (mix format
).
A subset of a file can be reformatted using the Internal Formatter
Published by KronicDeth over 2 years ago
untilBuild
to cover PATCH releases of 2022.1.JavaModuleBuilder
, which is why I was hard coding the ran previously.XmlSerializer
as equivalent of DefaultJDOMExternalizer
DefaultJDOMExternalizer
method calls weren't writing anything and the explicit attribute value accesses were,Published by KronicDeth over 2 years ago
Don't call .navigationElement
to prevent unnecessary decompilation when resolving references or showing
completions.
navigationElement
in ChooseByNameContributor
t
type.navigationElement
when resolving built-in types in :erlang
navigationElement
in CallDefinitionClause.implicitImports
for Kernel
andKernelSpecial.Forms
..navigationElement
in reference.resolver.Module.multiResolveProject
Handle PsiCompiledElement
in places that previously only handled source and decompiled Call
s
getElementDescription
for ModuleImplTypeDefinition
s in .beam files Only supported built-in types faked in :erlang
for nowModuleImpl
for scope.Type
Published by KronicDeth almost 3 years ago
FindUsageHandler
primary element based on application build numberdescription.html
.Published by KronicDeth almost 3 years ago
**
operator to lexer and parser.getUsageViewTreeTextRepresentation
to check find usages..beam
file for Issue #2386, I might as well add it as a regression test too.Restore tests that weren't being run after 2021.3 upgrade.
Upgrading to 2021.3 dropped the number of run tests from 3741 to 1452. This was due to a change in the packaging in 2021.3 that triggered a gradle bug.
markdown
in plugins listjava
plugin to handle the com.intellij.modules.java
depends
in plugin.xml
, the org.intellij.plugins.markdown
depends
needed markdown
added to the list to make some of the tests work. The failed tests weren't being run before after the 2021.3 upgrade.{:|, ..., ...}
as cons operator in Elixir Dbgi.decompiler.appendSignature
was used.element.textOffset
instead of element.textLength
was used for end of range.OtpErlangExternalFun
correctly as remote captures (&Mod.fun/arity
).Ecto.Changeset.validate_number
.Producer
from ElixirFile
without VirtualFile
.Unquote.treeWalkUp
no longer assumes that the final argument to unquote
is a Call
.FindUsageHandler
is now already resolved, so resolving it again for call definitions finds usages of def
, defmacro
, etc.FindUsagesProvider#canFindUsageFor
, definers can no longer be excluded, so remove that check.Quote
or Sigil
as normal text if part of documentation.Textual
annotator has to avoid annotating the same nodes as the ModuleAttribute
annotator or the colors can get interleaved.ENTRANCE
and Initial Visited Element in __module__.Resolver
.UnaliasedName.unaliasedName
for atoms.ElixirAtom#getName
Published by KronicDeth almost 3 years ago
Override org.elixir_lang.*.configuration.Factory.getId
to fix deprecation warning about the default implementation being accidentally localizable when it shouldn't be. The Elixir plugin didn't localize these name using message bundles, so this wasn't an actual risk, but overriding is the only way to silence the error.%{Alias}
.Published by KronicDeth almost 3 years ago
Level
and FilePropertyPusher
classes and all their usages, including in the parser grammar and the special ifVersion
external rule. It also eliminates the need for tests to setup the SDK since it was only needed to get the appropriate Level. This makes the tests run in 45 seconds instead of 7 minutes.Ecto.Query
calls
Resolve bindings in Ecto.Query.lock/3
Resolve bindings in Ecto.Query.windows/3
Walk preload
binding and expression
Resolve in update
for Ecto.Query
Resolve fragment
in with_cte
Resolve binding
and expr
in Ecto.Query.dynamic/1-2
Resolve field
in join(..., on: field(..., ...) ...)
For join/5
, descend into the options to look for on: value
and then walk value
the same as the value to having
or where
in selects since they're all boolean conditions.
Extract ecto.query.Nested
Resolve Ecto.Query.WindowAPI
functions
Resolve reference variable src in join(query, ..., [{src, counter}], ..., ...)
Tuple lists in join have two forms:
{^assoc, a}
{src, counter}
The pinned association form was already handled because the second element was checked for a declaration, but the first element was not, so src
in (2) could not be resolved.
from([..] in ...)
Treat or_having
the same as having
Treat or_where
the same as where
Treat having:
the same as where:
in from
Treat select_merge
the same as select
for resolving Ecto.Query.API
.
from(..., [elements])
Resolve Ecto reference variables in left in ...
ModuleWalker
and NameArityRangeWalker
ExUnit
test
s.describe
blocks.assert_receive
and assert_received
.alias
to modules defined inside the enclosing describe
block.assert
expression for variable declarations
=
in assert
.require
as:
arguments as Aliasesand
when there is a badbool error toocase expr1 do pat1 -> true; _ -> false; end
to match?(pat1, expr1)
if var do false else true
to !var
Resolve module attributes registered in elixir_module.erl
to decompiled source
Index module attributes
Use the index to resolve module attributes when it can't be found directly by tree walking.
Module.put_attribute/3
Module.register_attribute/3
quote
blocksquote
blocksquote
block. This helps with certain patterns of quote
blocks used in Ecto where a variable's declaration and usage are not in the same quote
block.ElixirStabBody
skipped call definitions because they were new scopes.Mix.Generator.embed_template
and embed_text
.import
s, defdelegate
, and use
calls are added to the resolve results after the preferred elements are chosen for source in the same module. This prevents only the import
showing because the actual declaration is in another module or the SDK.treeWalkUp
instead of requiring the caller to do it in the pass ResolveState
quoteCall
as visited in QuoteMacro.treeWalkUp
unquoteCall
as visited in Unquote.treeWalkUp
unlessCall
as visited in Unless.treeWalkUp
ifCall
as visited in If.treeWalkUp
importCall
as visited in Import.treeWalkUp
useCall
as visited in Use.treeWalkUp
test
describe
Qualifer.unquote(variable)(...)
to any definition with correct arity in Qualifier
.element.resolvedFinalArity
once in resolvedQualified
defimpl
function/macrodefprotocol
that the defimpl
implements.def
in defprotocolprependQualifiers
at top of filepreferred
and expand
system from Callables
to Modules
.MacroNameArity
for accept
, but use NameArity
only because no decompiler cares about the macro.EEx.function_from_(file|string)
EEx.function_from_(file|string)
exception/1
and message/1
defined by defexception
*_text/0
and *_template(assigns)
functions defined by Mix.Generator.embed_text
and Mix.Generator.embed_template
.Throwable
is necessary to get a stacktrace, but not a real error.2021.3
runPluginVerifier
in GitHub Actions
put_event
with suite_finished
getElementDescription(ElixirAtom, ElementDescriptionLocation)
Override getElementDescription for atoms to prevent StackOverflow while looking for a provider.
Don't descend into either branch of if
or unless
if entrance in either branch when resolving calls.
If the definition were in one of the branch, it would already have been found on processing previous siblings in the ElixirStabBody
.
Treat child of modulars as being at the same level if nested in if
or unless
Prevents test
in if
in supervisor_test.exs
in ecto
from stack overflowing.
Fix StackOverflow when looking for earlier bindings in parameters.
Don't check following siblings of modulars if entrance is a direct child
Prevent StackOverflow when trying to resolve embed_template when more than one appears in the same module.
In general, if the entrance is a child of modular then it can only be defined by a previous sibling, usually an import
or use
, but if the entrance is descendant of a child, then it child then it may be a call to a function or macro defined in the modular to following siblings of the entrance ancestor child needs to be checked if the entrance is a forward-call to a later declared function or macro.
Fix StackOverflowError in ifErlangRewriteTo
Don't rewriter :erlang.* to a different :erlang.*
fragment/1..
used in a quote
can resolve to one in Ecto.Query.API
.quote
quote do: query
or other variable names in the code and tests, so record those as declarations to resolve as invalid results.do:
is surrounded by parenthesesquote do: variable
would work, but now quote(do: variable)
also works to find the quote
call.QualifiedBracketOperation
qualifierStructOperation
qualifierunquote
to only have invalid results.unquote(schema).__schema__(:source)
Mix.shell().yes?("Are you sure you want to drop the database for repo #{inspect repo}?")
Ecto.Query
calls.
state.put(Query.Call, call)
for join/3-4
executeOnIn
.|>
in select
expressions.hints
lock
intersect
intersect_all
except
except_all
union
union_all
prefix
preload
offset
windows
limit
assoc/2
in join: .. in assoc(_, _)
in a no parentheses from
callvar
in type restrictionsBitString
BitString
is recognized in defimpl ..., for: BitString
to define protocol implementations for <<..>>
, but the BitString
module itself does not exist, so can't be resolved.at com.intellij.openapi.diagnostic.Logger
when calculating location for error report titlesevent
message
not being included, which meant that the excerpt wasn't included, so no reproducibility or element class was available.at
that isn't from the errorreport.Logger
instead of [auto-generated]
as this is the pattern I follow when renaming manually.alias __MODULE__.{...}
in prependQualifierDon't allow name to be acceptable named parent in &name/arity
.
Resolves #488
Allows Go To Declaration on name
and not just on /arity
.
Don't allow Mod.name
to be acceptable named parent in &Mod.name/arity
.
Resolves #488
Fixes #2101
Allows Go To Declaration on name
and not just on /arity
.
Resolve &name/arity
and &Mod.name/arity
using same code as callables.
Fixes resolving &Mod.name.arity and ensures that special handling for weird definitions for callables also apply to captures.
__MODULE__
in quote
to defmacro __MODULE__
in Kernel.SpecialForms
Fix String.Unicode decompiled being PlainText instead of Elixir
String.Unicode
when decompiled using all information from DbgI
was 161,171 lines long, which made the JetBrains API treat it as plain text instead of Elixir. Being that long also made it freeze the UI while being decompiled.
Now, don't even attempt to use the DbgI
if the function has more than 10 clauses.
Don't decompile private macros and functions if > 500 definitions in one module.
If body cannot be decompiled, decompile as one-liner with ...
body
Don't decompile Abst clause bodies that exceed 1024 bytes.
Decompile Erlang one clauses as Elixir one-liners
Find ancestorTypeSpec
for qualified type used in parentheses in anonymous function type in an alternation
@type run :: ((Ecto.Repo.t, changes) -> {:ok | :error, any}) | {module, atom, [any]}
Resolve type parameters used in inline anonymous function types
Resolve callback heads to themselves when they have type restrictions using when
Ignore literal parameters
Check left operand of \\
for type parameters as they could appear when copying def with defaults.
defdelegate
s when walking import
sconfig
from use Mix.Config
as it delegates to Config
match?
guards to pattern declarationon_delete
in match?(%{on_delete: on_delete} when on_delete != :nothing, reflection)
for:
for:
and (3) do
block. Not having a definition meant that the defimpl protocol, for: struct do
would be in AllName index, but not ModularName.for:
case
statements with parentheses when used in cond
clause conditions.
after callee when it is a module or fnMacro.toString(macro)
StackOverflowError when decompiling body of function clauses\x
to \\x
in OtpErlangStrprependIndent
because it indents blank lines too.mix format
or the IntelliJ Elixir formatting.after
in Erlang receive
when decompiling if empty.Infix
, Prefix
, and Unquote
decompolers for Erlang Abst chunk in addition to DbgI chunk
function.macroNameArityMacro.macro
when decompiling Erlang Abst clauses.def
anymore when unexported and therefore private; use defp
instead....
in decompiled private types.association.ex
in Ecto.%parameter{}
patterns for struct namesUnquote.treeWalkUpUnquoted
through tuplesQuote.treeWalkUp
through case
tailrec
because it doesn't work correctly for ElixirAccessExpression
ElixirUnqualifiedNoParenthesesManyArgumentsCall
.unquote_splicing/1
is reached.unquote_splicing
is being used to splat arguments or fields of a struct into the type. The arguments to unquote_splicing
are normal calls or variables, not types.call_definition_clause.Variants#executeOnCallback
CallDefinitionClause.time/1
Call
isValid
before using containingFile
for locationString
.project
is not dumb in nameArityInAnyModule
.resolveInScope
only if at least one validEcto
in defmodule Ecto.Adapter do
resolved to itself instead of the exact defmodule Ecto do
.ElixirVisitor
is also regenerated. When it was regenerated it lost the bug fix for #visitLiteralSigileLine
calling itself. Added a regression test, so that this can't happen again.in
in from
in
when an Erlang function, otherwise, use operators the same as Elixir for defs and calls.[]
.-
Elixir.Phoenix.HTML.Tag.beam
Identifer.inspectAsKey
by adding special cases as needed, but the decompiler kept having bugs, so port all of it including String.Tokenizer.tokenize
. It will also work for unicode characters now too.=>
parent
in place because the argument is called parent
, but since it is an extension function that value because this.parent
when it really should have been this
. Using this.parent
meant it would ask for the parent's children and keep looping back to this
.tailrec
in function with any body-recursion.ElixirAccessExpression
recursion sometimes.defdelegate
.LookupElementPresentation.putItemPresentation
addTailText
.presentableText
if it is prefixed by itemText
.inspectAsFunction
, local calls just used the atomValue
, which meant names that needed to be unquoted weren't and caused parsing errors.idna.beam
for
comprehensions cannot be used as the sole argument of a call unless surrounded by parentheses, so always add those parentheses.[]
for updatesleft xor right
as :erlang.xor(left, right)
bitstring
float
nonempty_improper_list
nonempty_maybe_improper_list
float
begin
blocks as parenthesized groups separated by ;string
record_index
when record name needs to be unquotedmap
updates in Erlang Abst:unquote(:"NAME")
from happeningfield_type
in Erlang Absthipe_icode_call_elim.beam
true
, but this pre-dated decompiling private functions. Now with decompiling private functions, isExported needs to defer to the Definition
and count as unexported if a private function, macro, or guard.PluginId.findId
that doesn't exist in 2021.1.XPublished by KronicDeth over 3 years ago
CallDefinitionHead
could not be checked if it was decompiled.
EOFException
while reading chunks from .beam
files that were incomplete.
mix deps
options for determining dependency paths on disk.
Type
scope processor and better error handling was necessary.
Callable.annotate
due to improper tracking of modular children leading to looping when there is more than one use
.
do:
.IndexNotReady
in resolver.Module.multiResolveProject
.__using__
to find quote in any clause. Fixes resolving test macro from use PowerAssert
quote
's scope when block
injected with unquote(block)
.field
, timestamps
, and index
in schema
for use Yacto.Schema
as it makes the block
see the import Yacto.Schema
above unquote(block)
in the quote
in schema(..., do: block)
.TODO()
true
is returned now it won't stop the type resolving from working.OuterElementType
in eex.lexer.TemplateData
.EEX
IElementType
needs to use OuterLanguageElementType
instead of the direct eex.psi.TokenType
.QualifiedAlias#text
in runReadAction
for QualifiedAlias#name
null
Chunk
instead of throwing IOException
when read incomplete.beam.FileEditor#getFile
to fix DeprecatedMethodException
as the default implementation is now deprecated and requires an explicit implementation.TabbedPaneWrapper.AsJBTabs
instead of JBTabbedPane
for "BEAM Chunks" tabs.JBTabbedPane
stopped showing its labels sometime in the 2020.X IDE version series, but by debugging when "BEAM Chunks" name was retrieved I found that the bottom tabs used TabbedPaneWrapper.asJBTabs
. Using that, the labels reappeared.PsiNamedElement
.ElixirAtom
and getting the reference will still work.Any.isDecompiled
for CallDefinitionHead
.Find Dep
s in function calls in the deps()
list.
Dep.putPath
from a variable.
Treat Memoize
defmemo
as def
and defmemop
as defp
.
Resolve exception/1
and message/1
to defexception
.
Resolve to callbacks when searching in any module.
Support arity intervals for unquote_splicing in parameters
Functions defined with unquote_splicing, such as Ecto.Schema.__schema/2
:
for clauses <- Ecto.Schema.__schema__(fields, field_sources, assocs, embeds),
{args, body} <- clauses do
def __schema__(unquote_splicing(args)), do: unquote(body)
end
Need to have their arity not be the number of PsiElements in the parentheses. Any call to unquote_splicing(...)
can end up have 0 to infinite parameters, so it means when one is saw, the range of minimum...maximum
should change to an open interval of minimum...
. This required changing IntRange resolvedFinalArityChange()
to ArityInterval resolvedFinalArityInterval()
on all Call
s, which was a large change. It also meant changing a lot of ArityRange types to ArityInterval, and NameArityRange to NameArityInterval, which influenced the variable names.
Since all Calls support ArityIntervals now and not just special forms and Ecto DSLs, exportArity is changed to always state the ResolveState, so that the special form changes can be integrated for all callers.
The actual implementation of CallImpl.resolvedFinalArityRange is changes to fold over the ArityInterval:
Published by KronicDeth over 3 years ago
Reference Resolution
Allow any Alias in a chain to have references.
This allows going to the declaration of Phoenix
, Phoenix.LiveView
, or Phoenix.LiveView.Socket
depending on whether you're on the Phoenix
, LiveView
, or Socket
Alias, respectively, in the chain.
Allow any Alias in Qualified Alias to be resolved
This allows going to the declaration of Phoenix, Phoenix.LiveView, or Phoenix.LiveView.Socket depending on whether you're
on the Phoenix, LiveView, or Socket Alias, respectively, in the chain.
Update DocumentationProvider to work with improved Alias resolution
Without these changes the DocumentationProvider double-resolves and so ends up showing the docs for def
and defmodule
, instead of the call definition clause or module, respectively.
Reimplement Module references
Instead of references for only the outermost QualifiableAlias, there is a reference for each right-most Alias at a given position, so instead of there only be a reference to App.Context.Schema
in App.Context.Schema
, there is now a reference to App
in the App
prefix, a reference to App.Context
in Context
in App.Context
, and a reference to App.Context.Schema
in Schema
in App.Context.Schema
. Not only is this more useful, being able to jump to parent namespaces, but it fixed some of the capability issues with Go To Definition in the 2020 line of IDEs. This approach of using getRangeInElement
to target the range of the right-most Alias, while the element was still the parent that contained, but did not go beyond the Alias, was tried after having references only on Alias
es and not QualifiedAlias
es did not fix completion issues. It was the while debugging Go To Declaration actions and noticing they were sensitive to the range in element AND the docs for PsiReference#getRangeInElement that I realized that the Go To Declaration and Completion has a hidden requirement that References for things that behave like namespaces have to work this way.
ModularName
index for Module VariantsisAlias
check.Limit Elixir Module resolution to same JetBrains Project Module
GlobalSearchScope
from allProject
to moduleWithDependenciesAndLibrariesScope
for faster searching on multi-module projects.
includeTests
based whether the referring element is in a test directory.StubIndex#processElements
instead of home grown forEachNavigationElement
as processElements
is more efficient.Favor Module ResolveResults
under same Module
content roots
This should favor deps sources in the same module.
Iterate function
body in unquote(function())
when iterating call definition clauses in quote
Treats it function
body the same as a __using__
body.
Standardized preferred ResolveResult
filters between Callables and Modules
In Go To Declaration also:
Use the second argument to use
to determine which function is called with apply/3
This pattern is used in Phoenix __using__
, so this lets to differentiate whether Plug.Conn.assign/3
or Phoenix.LiveSocket.assign/3
is resolved in a Controller, LiveComponent, or LiveView.
In LEEx Templates
*.html.leex
templates to functions defined in the corresponding LiveComponent/View module.assign/3
calls in update/2
in the LiveComponent or LiveViewTargetElementEvaluator
, so that the UnqualifiedNoArgumentCall
(name
) that is the identifier in an assign (@name
) was not counted as valid target for Find Usages / Go To Declaration by itself.update
to any call definition to cover helper functions and other callbacks. Don't stop on the first valid match because with helper functions and multiple callbacks, the last write isn't obvious.assign/3
assign
calls in |>
pipelinesassign_new/3
render_pending_components
case
and if
live_component
callslive_component
call itself, so look for any references to the view module (the LiveComponent) and if it is a live_component
call, then look at those assigns to try to resolve the assign name.live_modal
callslive_modal
is not built into phoenix_live_view
, but it is generated by phx.gen.live
, so most projects will have it. This allows return_to
, which is used use in live_modal
, to be resolved.@socket
to last socket variable or call in view module.@flash
to put_flash/3
calls.@inner_content
to Phoenix.LiveView.Utils.to_rendered/2
setting the assign with put_in
.leex
templates.leex
and use
walking from call definition clauses to any scope processor lambda, so it can be used to resolve uses of Routes
in .leex
templates.Resolve Types
@type
, @typep
, or @opaque
; and named type parameters.@type
, @typep
, and @opaque
.@callback
as declaring a Typet
for defprotocol
to where it is defined in Protocol.__protocol__
t
to the same element, so Find Usage finds all protocol's types instead of just a specific module's type, but this works for projects that have source, but not yet compiled.
@type t
when available.__MODULE__
Favor source over decompiled per name instead of overall for ResolveResultOrderedSet
This allows the Routes
alias to be resolved to the both the MyAppWeb.Router.Helpers
in alias MyAppWeb.Router.Helpers, as: Routes
in the source of MyAppWeb
, but also the decompiled MyAppWeb.Router.Helpers
, which is necessary as MyAppWeb.Router.Helpers
is produced on compile from router.ex
.
Resolve references through defdelegate
calls.
Resolve code_reloading?
in MyApp.Endpoint
The generated MyApp.Endpoint
for mix phx.new
has a section to enable code-reloading at compile time:
# Code reloading can be explicitly enabled under the
# :code_reloader configuration of your endpoint.
if code_reloading? do
socket("/phoenix/live_reload/socket", Phoenix.LiveReloader.Socket)
plug(Phoenix.LiveReloader)
plug(Phoenix.CodeReloader)
end
Previously, code_reloading?
variable would not resolve because psi.scope.Variable ignored use
calls, not use
calls are entered and the var!(code_reloading?)
is found in Phoenix.Endpoint.config/1
by way of the unquote(config(opts))
call in the quote
block in __using__(opts)
.
Resolve qualified calls with unknown resolvable qualifier using only relative identifier and arity.
@spec
@spec
to defdelegate
calls.Ecto
Query
Resolve reference variables in Ecto.Query
in
passed to from/2
and the join:
keyword in from/2
.join/3-5
select/2-3
.where/2,3
binding.a
in [{^assoc, a}]
binding.bindings
in group_by/2-3
.bindings
and expressions
in order_by/2-3
.bindings
in having/2-3
.select_merge
to declaring Ecto.Query
macros.distinct/2-3
as a declaring Ecto.Query
macro.Resolve field
calls in Ecto schema
blocks
How field
works in schema
for Ecto.Schema
use Ecto.Schema
Ecto.Schema.__using__
Note that only the outer DSLs, schema and embedded_schema are available even though field/2 is defined in Ecto.Schema.
So when you call schema ... do
defmacro schema(source, [do: block])
schema(__CALLER__, source, true, :id, block)
defp schema(caller, source, meta?, type, block)
prelude = quote do
quote blockAt the end of prelude there is
try do
import Ecto.Schema
unquote(block)
after
:ok
end
Hey! An import Ecto.Schema
, but prelude
is just floating as a variable. At the end of defp schema(caller, source, meta?, type, block)
is
quote do
unquote(prelude)
unquote(postlude)
end
So to statically analyze an Ecto.Schema
module.
schema/2
to defmacro schema
by walking the use
, __using__
, quote
, and import
.schema/2
(or macros in general if you want to get fancy 💅 and support more DSLs),quote
block at the end (the same as my current __using__
support)Call
inside an unquote
see if you can resolve it to a variable in addition to a call definition (which is already supported for Phoenix).quote
, use the quote block handlingtry
try
and see the import
, walk the import
to find Ecto.Schema.field/2
API
Ecto.Query.API
functions in Ecto.Query
from(order_by: ...)
from(select: ...)
from(select: tuple())
from(where: ...)
group_by/2-3
having/2-3
select/2-3
expr
argumentwhere
Ecto.Query.API.fragment
to arity interval 0..
.fragment
nested in other Ecto.Query.API
call like type
.rightOperand
of join(..., ... in ..., ...)
for Ecto.Query.API
usages like fragment
.Resolve module attributes defined in use
__using__
quote
block
org.elixir_lang.reference.resolver.ModuleAttribute
to use PsiScopeProcessor
for non-@for
and non-@protocol
instead of custom logic.use
if the ENTRANCE
is an ancestor since that means the Alias
on the use
is probably being resolved.AtUnqualifiedNoParenthesesCall.processDeclarations
will call processor.execute
when it isn't a type spec.UseScopeSelector
for AtUnqualifiedNoParenthesesCallImpl
has been changed to SELF_AND_FOLLOWING_SIBLINGS
since the module attribute is used that way. The previous SELF
value was when the UseScopeSelector
only applied to variables."Elixir References" inspection for finding unresolved or invalid references.
visitAtNonNumericOperation
Strip AccessExpression
s from Qualified
qualifiers automatically
Documentation
deprecated
, impl
, and spec
, and actual heads in documentation for source functionsDocumentation
across multiple arities when arity of lookup is ambiguous.Find variables defined in EEx element
Finds variables defined in EEx PsiElement by creating them the same as a StabBody, which means that the siblings are checked backwards from the last parent. This fixes resolving the f
from f = form_for ...
in *input f ...
in LiveView FormComponent templates.
Highlight named parameters in types.
Decompilation
:erlang.beam
:erlang.beam
(even though they aren't actually defined there), there is a shared location for all reference to point to and then check for Find Usages.Descend into body of unless
in quote
for treeWalkUp
.
Descend into for
when looking for call definition clauses.
QuoteMacro.treeWalkUp
into if
unless
was already walked, but not if
. Fixes resolving Repo.preload/2
, which is defined inside an if
in use Ecto.Repo
's __using__
.
Add defguard
and defguardp
to CallDefinitionClause.is
.
Don't generate a reference for Elixir
Elixir
is not declared anywhere. It is the namespace of all Aliases.
Refactor how sibling sequences are walked
Port filtering out comments, white space and end of expressions from siblingExpression
.
Reimplement fullyQualifiedName
Eliminate the specialization for ElixirAlias
AND QualifiableAlias
as which was picked as based on the static casted type. fullyQualifiedName
will include the following:
__MODULE__
to the enclosing modular canonical nameElixirMultipleAliases
will combine the qualifier (qualifier.{...}
) outside the {}
with the relative name inside ...{relative, ...}
.EEx
viewFile
for .eex
files used in same directory as .ex
using EEx.function_from_file
.EEx.function_from_file/3-5
.templates
directory.Walk quote
macros for sibling call definitions
Always fallback to name/arity in any module if callable not resolved in scope
Resolve uses of aliased name produced by alias __MODULE__
ParsingTestCase
to latest APIs.runPluginVerifier
Fix Ctrl+Click/Cmd+B/Go To Declaration for Aliases.
Don't index non-canonical names.
The non-canonical name for a nested defmodule
is the Alias given to that defmodule
call. While that name should be resolvable within the parent modular, it should not be indexed because the index is for the global scope.
Prevents defmodule Enum
in
defmodule ExJsonSchema.Validator.Error do
...
defmodule Enum do
...
end
...
end
from being indexed as Enum
, which hides the decompiled version from the standard library because source references are favored over decompiled versions when resolving references.
Reference Resolution
Only favor same file Module resolutions if they are valid
Invalid same file results can occur for prefix matches, but if only prefix matches are available, then a whole project search should occur instead of only when there are no same file ResolveResult
of either validity.
Include library sources in Module#multiResolveProject
GlobalSearchScope
Ensures that library sources can be returned, which are favored over decompiled libraries, so that __using__
macros can be followed.
Protect from Module
reference element not having a VirtualFile
when checking if a test file.
Fix QualifiableAliasImpl#fullyQualifiedName
MultipleAliases
alias
line like alias Myapp.MyContext.{Schema1, Schema2}
, Schema1
would think its fullyQualifiedName
was only Schema1
, when it should included the fullyQualifiedName
of the qualifier, MyApp.MyContext
too. This leads to the correct Schema1
fully-qualified name of MyApp.MyContext.Schema1
. This fix makes references to Schema1
resolve to both the alias
and the defmodule
.MultipleAliases
for deep aliasesalias
line like alias Myapp.MyContext.{NestedContext1.Schema1, NestedContext2.Schema2}
, Schema1
would think its fullyQualifiedName
was only NestedContext1.Schema1
, when it should included the fullyQualifiedName
of the qualifier, MyApp.MyContext
too. This leads to the correct Schema1
fully-qualified name of MyApp.MyContext.NestedContext.Schema1
. This fix makes references to Schema1
resolve to both the alias
and the defmodule
.In LEEx Templates
false
, true
, nil
)|> case do ... end
None
calls were ignored, but when case
is used in a pipeline it is a None
since it has no literal arguments and only resolved arguments, so it was being ignored.if
sstab
of the doBlock
, but the else
is in the blockList
.Don't use the same path for actual aliases and defmodules when resolving aliases
Prevents a case of an exact match and its namespace both being marked as valid (exact matches).
Types
required/1
and optional/1
)...
in lists in type specs.ElixirStabBody
for ancestorTypeSpec
.Callable
reference for unquote
in typespec instead of Type
reference.Allow modular names to resolve to multiple modulars
Fix :systemd.ready()
not resolving because :systemd
only exists as a decompiled file from source because it is Erlang and there is no preference given to different MIX_ENVs. All MIX_ENV defmodule :systemd
are returned for the :systemd
and all of them are checked for ready/0
.
Fix resolving qualified calls that are defined through use
Resolving qualified calls only used Modular.callDefinitionClauseCallFoldWhile
, which ignores all non call definition, which means it ignored the use
, but switching to use org.elixir_lang.psi.scope.call_definition_clause.MultiResolve
PsiScopeProcessor
used for unqualified calls, but starting on the modular call of the qualifier, all the use
handling that works for unqualified calls also works for qualified calls now.
This fixes resolving MyAppWeb.Endpoint.config_change(changed, removed)
in MyApp.Application.config_change/3
because use Phoenix.Endpoint, otp_app: :my_app
in MyAppWeb.Endpoint
is now walked for qualified calls.
Fix resolving variables to parameters that are both pattern matched and defaulted
In functions like
def f(%Struct{} = s \\ %Struct{}) do
s
end
s
in the body would not resolve to the s
parameter because the default parameter had to be PsiNamedElement
, that is a variable directly. Instead, recurse on any operand before the \\
to support pattern matching too.
Use keepProcessing()
in MultiResolve.addToResolveResults
instead of specific return values
Fixes def
in def default_host_flag, do: "--host
resolving as an invalid match to default_host_flag
instead of search the implicit imports for defmacro def
.
The nameIdentifier
for a defdelegate
is the first argument, not the as:
The as:
is the name in the to:
module only.
Fix defdelegate
MultiResolve
as
name for checking for a name matchdefdelegate
as matching if the as
name as found in to
module, but if the head alone is prefixed by the name then the head should be a ResolveResult element even if the to
or as
can't be foundto
, I only checked if the children were call definition clauses, but this meant that all the for
handling was ignored, so start a new resolveResults()
for each modular.Fix toModulars
not returning all modulars
fullyResolve
only touched the first modular.
Favor complete valid results over incomplete invalid earlier bindings for variables.
Ecto
assoc/2
pseudo-function in join(..., _ in assoc(_, _))
Fix unaliasing multiple aliases
UnaliasName
still assumed that fullyQualifiedName
included the qualifier, but it is just the lexical qualifier now.
Check for MULTIPLE_ALIASES_QUALIFIER
in ResolveState
for prefix matches.
Fixes resolving SSH.Key
to Foo.SSH.Key
when the alias is alias Foo.{SSH, ...}
.
Ignore type variables in type restrictions when resolving normal variables.
Fix withSelf
for childExpressions
siblingExpressions
call
While refactoring the walk, I copied the call for siblings, which shouldn't included self. Children should include self, or the first expression is missed which showed up as Repo.transaction
not being found because transaction
is the first def
inside an if
in Ecto.Repo.__using__
's quote
block.
Don't try to resolve keys/fields of a capture.
Don't generate reference for assoc
in *join*: .. in assoc(..., ...)
.
Already worked for join/3
calls, extend to keyword syntax too.
Fix resolving references to Modulars
when resolved is in BEAM file
The check to see if the resolved was a modular only worked for source elements because it checked if it was a Call
, but decompiled modules in BEAM files are ModuleImpls
.
Fix logic error when ignored pinned variables as declaration sites
The logic was supposed to be that
... but, the code was operatorText != "^" && execute(match as Call, state)
which meant that if the operatorText
was "^"
, then the whole expression was false
, which meant keepProcessing
was false
, so any pin stopped the processing for other unpinned parameters after the pin in addition to processing in the outer scope of the pin.
Prefer source only for target candidates for Go To Declaration and not all ResolveResults.
Ensures that functions only defined in decompiled Modules can be found because the Module's ResolveResults include the decompiled Module in addition to the source ones.
Don't prefer source over decompiled in ResolveResultOrderedSet
Preference is now handled in Resolver
, so that source preference only happens on Go To Declaration and not for multiResolve
because that needs decompiled Modulars for compile-time for
loops that are too complex to infer.
Use primary arity instead of final for resolving Callables
Fixes unquote
in def unquote(...)() do
not resolving.
Filter out decompiled private functions from completions
If they are only available as decompiled functions, it is unlikely we have the source available to make them public, which was the reasoning to allow private functions at all.
Decompiling
and
when not and/2:hipe_arm_encode
.unquote
false
when decompiling.:thrift_json_parser
. Add true
to the Unquote
list too since it would have the same issue.in
when not in/2
:digraph_utils
containingFile.originalFile
for resolve.Module.multiResolveProject
VirtualFile
is available for decompiled files.Performance
Don't use .navigationElement
for Variants
Using navigationElement
forces parsing of the decompiled source, which isn't necessary whe only showing the lookup string.
Remove ModuleOwner
interface
BeamFileImpl
is known to have only 1 module in it, so it makes the code more complicated to make it act like source files.getChildrenByType
, as it causes the decompiled source to be parsed, which is slow and unnecessary since all the metadata for modules is available from the binary format.Get project from parent in decompiled Module and CallDefinition
Not doing this causes an unnecessary parsing of the decompiled source.
Fix infinite recursion in ElixirVisitor#visitLiteralSigilLine
Show more scope for keyword key Go To Definition
live_modal
may be used more than once in the same file.Put entrance
as initial visited in module.Variants
.
Check if PsiElement
has been visited before walking quote
and __using__
Don't mark qualified calls as unresolved in "Elixir References" inspection
I don't have a good approach for resolving struct fields or map keys for now, don't mark them as unresolved as it clutters finding unresolved calls I expect to work.
Don't assume PsiFile#virtualFile
is NotNull
in PsiElement.moduleWithDependentsScope
.
Don't assume PsiFile#virtualFile
is NotNull
in AtNonNumericOperation.computeReference()
.
putInitialVisitedElement
in variable.MultiResolve
Fixes resolving variables through use
statements for variables in the body of defmodule
blocks.
Log when VISITED_ELEMENT_SET
is null
instead of erroring.
Fix resolvePrimaryArity
for |> case do
resolvedPrimaryArity
did not add both the doBlock's arity and the arity from the |>
at the same time. If the pipe was there, the do
was ignored because the pre-existing resolvePrimaryArity
was not used if the normal primary arity of the call was zero, which is the case for |> case do
.
Find module for elements in libraries
Elements in libraries don't have a Module
from ModuleUtil.findModuleForPsiElement
, so scan the element's project's module's content roots for the closest Module
for libraries.
prependQualifiers
when typing an alias on a new line in the body of a function.
Don't descend into quote
blocks if the call being resolved is given to an unquote
in the quote
block.
updateSinceUntilBuild
to prevent breaking in future IDEs.findModuleForPsiElement
.BasePlatformTestCase
instead of LightCodeInsightTestCase
because LightCodeInsightTestCase
is deprecated.