Bot releases are visible (Hide)
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.Published by KronicDeth over 3 years ago
Call.finalArguments
html.leex
was not being being parsed as HTML for the template data language.
onlyTemplateDateFileType
Code
disassembler
bs_start_match4
make_fun3
init_yregs
recv_marker_bind
recv_marker_clear
recv_marker_clear
recv_marker_user
PsiElement
if Call#finalArguments
contain a null
.homepath
s for both Elixir and Erlang for Elixir SDKs.mix dialyzer
or any customized mix
command.VirtualFile#fileType
instead of EEx Type::INSTANCE when looking up extensions.Type
is a subclass of EEx's file Type
, it calls templateDataFileTypeSet
in EEx's Type
, but templateDataFileTypeSet
uses INSTANCE
from EEx. By using the VirtualFile#fileType
instead, it will properly be EEx or LEEx based on the actual file extension and then it can be used to strip that off and find the DataTemplateLanguage, such as HTMLLanguage
for .html.leex
.Enum
s are 0-based, so the comparison was off-by-1 when a file had the max opcode and would be incorrectly marked as too new.primaryArguments
operation.infix.Normalized.leftOperand
and .rightOperand
ensures that PsiErrorElement
is not returned: they can return null
when there is no left or right operand. Infix.primaryArguments
was not taking this into account and so could return a null
as one of the primaryArguments
, which broke Call.finalArguments
.elixir -e "System.version |> IO.puts"
to get the version number as it requires too much of a full SDK to be built and from the Erlang paths to be correct too, which was rarely the case for ASDF. Since for Homebrew and ASDF, the directory name is the version name, this shouldn't be a loss in naming ability. If the directory name is not a parseable version it will be of the format Elixir at <path>
. This is probably more correct for installs directories that aren't versioned as SDK versions aren't updated if the version installed at the path changes, such as /usr/local/elixir
or /opt/elixir
, etc.You'll be presented with a "Run 'Dialyzer based inspections (Elixir)'" dialog
The Inspections Result Tool Pane will open and show results as each file is processed.
Click the ▶ to expand the Credo section to show all warnings
Click an entry for the details of an individual warning with a code highlighting.
Published by KronicDeth over 3 years ago
LexerEditorHighlighter
code with me on JetBrains Platform Slack
Module
and Ecto.Query
.
~S
for @moduledoc
too, in addition to @doc
."""
or '''
and use the opposite one as the promoter/terminator.
"""
."""
, but then escape """
as \"\"\"
.runIde
maxHeapSize
to 7g
FormattingTest
files can be parsed.YYINITIAL
is special - wrappers of the lexer assume that if in YYINITIAL
, it is safe to shift the lexer over when there is an error, having {OPENING_CURLY}
pushAndBegin(YYINITIAL)
when it was either in YYINITIAL
or INTERPOLATION
means that the lexer looked like it was restartable when it really wasn't. This code has been in the lexer for 6 years.
YYINITIAL
, {
no longer recurses into YYINITIAL
as }
does not need to be counted to determine if it is closing an interpolation.INTERPOLATION
, {
enters INTERPOLATION_CURLY
to allow counting and matching of }
until it can exit and go back to INTERPOLATION
, where }
will exit the interpolation.INTERPOLATION_CURLY
, {
enters another level of INTERPOLATION_CURLY
to allow counting and matching of }
until it can exit and go up a level.}
in YYINITIAL
did yybegin(ADDITION_OR_SUBTRACTION_MAYBE)
, but it should have been pushAndBegin(ADDITION_OR_SUBTRACTION)
as ADDITION_OR_SUBTRACTION_MAYBE
or its following states all exit with handleInLastState()
or popAndBegin()
. This was not caught in #1859 because the extra YYINITIAL
from pushAndBegin(YYINTIAL)
hid the bug.YYINITIAL
bugs in the future by erroring
pushAndBegin(YYINITIAL)
.push(YYINITIAL)
and the state stack is not emptyElixirFlexLexer#reset
is called, as at the level of typing and pasting, the ElixirFlexLexer
is wrapped in many layers of lexers including LexerEditorHighlighter
where the ElixirFlexLexer
is no longer re-instantiated when there is no text, but instead, ElixirFlexLexer#reset
is only called. This has always been an invariant violation since the stack state was added 7 years ago. It likely only became more apparent with the changes to +/- parsing in #1859 that made return-to-YYINITIAL
less likely.
stack.clear()
has to be manually added to ElixirFlexLexer.java
, which is generated from Elixir.flex
, ResetTest
is added to check that the code is still there.LexerEditorHighlighter
stops working after :
is typed at the start of an atom in certain situations, such as before )
inside a function call, like when adding an argument. In this case, the old version of the lexer would mark )
as a BAD_CHARACTER
and continue to do so until an expected atom start of [a-zA-Z_], '
, "
, or an operator occurred. Now, if an invalid atom start is matched, the ATOM_START
state ends and the previous state handles the text, which in the function case mean )
is parsed as CLOSING_PARENTHESIS
. This change allows the highlighting to continue. I do not know if returning BAD_CHARACTER
will always break the LexerEditorHighlighter
, but I don't think, so since the GroovyLexer
in intellij-community
returns it, but it may be the case that it isn't actually returned ever when users are typing and only handled by the lexer for completeness.Published by KronicDeth almost 4 years ago
Kernel
and Kernel.SpecialForms
due to bugs in #1834.
Fix syntax highlighting stopping due to decompiling of Kernel
failing caused by bugs introduced in #1834.
Syntax highlighting could fail part way through a file when Kernel
needed to be decompiled to resolve parts of the syntax. This would lead to the file to be colored above a certain point, but then the default gray after that point.
Docs
, it was guaranteed that the PsiCompiled
stubs would correlate, in-order, with the decompiled source call definitions, and so mirrors could be set by matching up the list of them in order. Since the Docs
doesn't have to correspond to and doesn't correspond to the binary precisely for some BEAMs, most importantly, Elixir.Kernel.beam
, the PsiCompiled stub and decompiled source is now matched by name and arity. This means some mirrors are missed, but no errors are produced.Docs
can have default arguments the call definition clauses can have an arity range and not just a fixed arity, so all arities in the range need to be mappable to PsiCompiled
functions.Docs
.def
as in #1834.~S"""
for docs from Docs
chunk.Docs
chunk may contain interpolation in the code samples or #{
in regex examples, but these should not be treated as an interpolation start as the Docs
format does not support interpolation. Anything that looks like interpolation in the docs text was actually escaped in the original docs, so also escape it here by using S"""
, which turns off interpolation.Code
function can't be matched to decompiled source.InvalidMirrorException
, this won't be an exception and the binary <-> decompile will still work for the other functions/macros in the file, so it will be a more graceful degradation.DepsWatcher
as project componentDepsWatcher
was converted to a Project Listener in #1844 to support installing the plugin from the Marketplace without reloading, but some references to DepsWatcher
were still trying to get its instance for project using project.getComponent()
, which would now return null
.mix
to build projects.unquote(ATOM)
call definitions to compiled function by using the argument tounquote
when calculating the name of the call definition clause if possible.unquote
d because they contain /
to separate the outer function name from the anonymous function naming convention.Docs
signature for MacroNameArity
that is an operator or unquote
dunquote
d don't produce valid code that can be parsed.__struct__
functions.__struct__
functions are like %Module{}
, but that's not parseable, so bypass the signatures with a specialized SignatureOverride
decompiler that matches the actual code in defstruct
.Docs
for @moduledoc
and @doc
to match the formatter output.Docs
@moduledoc
@moduleDoc
-> @moduledoc
Published by KronicDeth almost 4 years ago
-1
could not be parsed as a case
clause.
DepsWatcher
from project component to project listenerWatcher
from module component to project listenerassert
.if
with when
asd
tool versiongradlew
6.7.1
org.jetbrains.intellij
0.6.3
org.jetbrains.kotlin.jvm
1.3.70
de.undercouch.download
to 4.4.1
no_parens: true
metadata@Deprecated
to match overridden methodQuoter
to KotlinDocumentationProvider
so it no longer relies on invoking mix
(which I admit was more like a hack than a real solution). This now works so quickly that it actually makes sense to show docs on mouse hover.
@moduledoc
and @doc
sp0
, p1
, ...).fileTypeFactory
extensions with fileType
fileType
s to KotlinProject#baseDir
ContainerUtil.newHashMap
defaultLiveTemplatesProvider
with defaultLiveTemplates
spaceExistanceTypeBetweenTokens
replaced with spaceExistenceTypeBetweenTokens
ListCellRendererWrapper
with SimpleListCellRenderer
StdFileTypes.PLAIN_TEXT
with FileTypes.PLAIN_TEXT
LanguageSubstitutors.INSTANCE
with getInstance()
ReportMessages.ERROR_REPORT
with ReportMessages.getErrorReport()
DefaultProgramRunner
with GenericProgramRunner
flushBufferBeforeTerminating()
acceptsFile
initExtra(Project)
instead of initExtra(Project, MessageBus, Engine)
NamedFoldingDescriptor
with FoldingDescriptor
folding.Builder
to Kotlinfile
with value
for @Storage
annotationcheckBox(fieldName, title)
with checkBox(title, getter, setter)
com.intellij.util.contains.Predicate
with java.util.function.Predicate
CodeStyleSettingsManager
with CodeStyle
Comparing.equal
with Objects.equals
UsageType(String)
with UsageType(Supplier)
PluginManager
with PluginManagerCore
WakValueHashMap
with createWakeValueMap
Pass
to LineMarkerInfo
newArrayListWithCapacity
with ArrayList
newIdentityHashMap
with IdentityHashMap
RefElement#element
with #psiElement
columnMargin
to setupCheckboxColumn
Extensions.getExtensions(name)
-> name.extensionList
Extensions.findExtension
-> ExtensionPointName.findExtensionOrFail
Object
-> Any
choseAndSetSdk
with SdkPopupFactory
ErrorBean
SetupSDKNotificationProvider
AnnotationHolder::create*
APIs and use AnnotationBuilder
instead.
Annotator
s to Kotlinlogger.error
directly instead of LogMessageEx
Macro
parsing in DbgI
ifAccessToString
[Access, :get]
and was checking the outer tuple directly.
beam.assembly.ParserDefinition
to KotlinifWhenToString
where as
should be as?
TODO()
sLine
chunk dependency on Atom
chunkunsignedInt
values to _
as Kotlin doesn't support _name
key
instead of environment for computeIfAbsent
!!
smapIndexed
with map
because index
is unusedopen
that has no effect in object
is
overrides by converting to KotlinCall
from Implementation.
and CallDefinitionClause
.elementDescription(Call, ElementDescriptionLocation)
.resolveResultList
in addToResolveResultList
?:
!= null
Float.from(ByteArray, Int)
to TODO()
as implementation is invalid.ModuleChooserDialog
EncodingManager
for ParsingTestCase
internal
-1
for case
clauses (#1316) by more strictly parsing decimal exponent signs differently than addition/subtraction and differently from unary +
and -
. No longer have a "dual" operation emitted from the lexer like the Elixir native lexer and instead use specific tokens for each use case so that the parser doesn't need to decide on the operation.IndexOutOfBounds
from highlighterIterator
in QuoteHandler
.Published by github-actions[bot] almost 4 years ago
Published by github-actions[bot] about 4 years ago
Published by KronicDeth about 4 years ago
BIG_CREATION
.
BIG_CREATION
when debugging.brew edit erlang
) to add --with-java
and then built with brew install erlang --build-from-source
.file.path
to the debugger server files has \
, but they aren't escaped. Therefore, replace them with escaped version, \\
to fix debugging on Windows, but leave Linux and macOS unaffected.