{"id":13451347,"url":"https://github.com/Benjamin-Dobell/IntelliJ-Luanalysis","last_synced_at":"2025-03-23T18:32:21.131Z","repository":{"id":37413727,"uuid":"231814734","full_name":"Benjamin-Dobell/IntelliJ-Luanalysis","owner":"Benjamin-Dobell","description":"Type-safe Lua IDE — IntelliJ IDEA plugin","archived":false,"fork":false,"pushed_at":"2023-11-13T05:53:05.000Z","size":29958,"stargazers_count":158,"open_issues_count":75,"forks_count":22,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-03-20T07:55:35.586Z","etag":null,"topics":["intellij","intellij-plugin","lua","lua-ide","lua-plugin","luanalysis","static-analysis","type-checking"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Benjamin-Dobell.png","metadata":{"files":{"readme":"README.asciidoc","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null},"funding":{"github":["Benjamin-Dobell"]}},"created_at":"2020-01-04T19:09:21.000Z","updated_at":"2025-02-27T10:03:24.000Z","dependencies_parsed_at":"2023-11-13T06:33:32.856Z","dependency_job_id":"3dc50f78-ec36-4bec-a272-4fb6907f9409","html_url":"https://github.com/Benjamin-Dobell/IntelliJ-Luanalysis","commit_stats":null,"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Benjamin-Dobell%2FIntelliJ-Luanalysis","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Benjamin-Dobell%2FIntelliJ-Luanalysis/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Benjamin-Dobell%2FIntelliJ-Luanalysis/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Benjamin-Dobell%2FIntelliJ-Luanalysis/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Benjamin-Dobell","download_url":"https://codeload.github.com/Benjamin-Dobell/IntelliJ-Luanalysis/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245149555,"owners_count":20568923,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["intellij","intellij-plugin","lua","lua-ide","lua-plugin","luanalysis","static-analysis","type-checking"],"created_at":"2024-07-31T07:00:52.392Z","updated_at":"2025-03-23T18:32:16.120Z","avatar_url":"https://github.com/Benjamin-Dobell.png","language":"Kotlin","funding_links":["https://github.com/sponsors/Benjamin-Dobell","http://github.com/sponsors/Benjamin-Dobell"],"categories":["Kotlin"],"sub_categories":[],"readme":"= Luanalysis (an EmmyLua fork) for IntelliJ IDEA image:https://github.com/Benjamin-Dobell/IntelliJ-Luanalysis/actions/workflows/build.yml/badge.svg[\"Build\", link=\"https://github.com/Benjamin-Dobell/IntelliJ-Luanalysis/actions/workflows/build.yml\"] image:https://img.shields.io/github/sponsors/Benjamin-Dobell?style=social[\"Sponsors\", link=\"http://github.com/sponsors/Benjamin-Dobell\"]\n:toc:\n:toc-placement!:\nifndef::env-github[:icons: font]\nifdef::env-github[]\n:tip-caption: :bulb:\n:note-caption: :information_source:\n:important-caption: :heavy_exclamation_mark:\n:caution-caption: :fire:\n:warning-caption: :warning:\nendif::[]\n\nAn IDE for statically typed Lua development.\n\n_Derived from https://emmylua.github.io/[EmmyLua]._\n\nimage:./snapshot/overview.gif[snapshot]\n\ntoc::[]\n\n== Editor Features\n\n=== Find usages\n\nimage:./snapshot/find_usages.gif[find_usages]\n\n=== Rename\n\nimage:./snapshot/rename.gif[rename]\n\n=== Parameter hints\n\nimage:./snapshot/param_hints.png[param_hints]\nimage:./snapshot/param_hints_cfg.png[param_hints_cfg]\n\n=== Go to symbol\n\nimage:./snapshot/go_to_symbol.gif[go_to_symbol]\n\n=== Go to class\n\nimage:./snapshot/go_to_class.gif[go_to_class]\n\n=== Quick Documentation (Ctrl + Q)\n\nimage:./snapshot/quick_documentation.gif[quick_documentation]\n\n=== Method separators\n\nimage:./snapshot/method_separators_cfg.png[method_separators_cfg]\nimage:./snapshot/method_separators.png[method_separators]\n\n=== Method override line marker\n\nimage:./snapshot/method_override_line_marker.gif[method_override_line_marker]\n\n== Installation\n\nThe latest release is available for download within IntelliJ or from the\nhttps://plugins.jetbrains.com/plugin/14698-luanalysis[Jetbrains Plugin\nwebsite].\n\n== Static Analysis Features\n\nLuanalysis is derived from EmmyLua and supports all the basic editing and refactoring functionality provided by\nhttps://github.com/EmmyLua/IntelliJ-EmmyLua[EmmyLua].\n\nBeyond basic Lua editing capabilities, Luanalysis supports a significant amount of additional functionality necessary to statically type advanced codebases.\n\n_*Note*: Features are roughly listed in the order they were implemented, by no means order of importance._\n\n=== Demo Project\n\nA great way to see what’s possible in terms of static typing is to checkout the\nhttps://github.com/Benjamin-Dobell/LuanalysisTypesDemo/[Luanalysis demo\nproject].\n\n=== EmmyDoc Block Comments\n\nimage:./snapshot/1_emmydoc_block_comments.png[image]\n\n=== Type casts\n\nIn addition to defining new types, the `@type` tag can now be also used to cast the result of a Lua expression.\n\nThis is most useful with the newly added support for EmmyDoc block comments as we can easily specify inline type casts:\n\nimage:./snapshot/2_type_casts.png[image]\n\nhttps://github.com/Benjamin-Dobell/LuanalysisTypesDemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/type_casts.lua\n\n=== Improved variance detection\n\nEmmyLua attempts to determine if a type is assignable to another type simply by checking if the former is a \"subtype\" of latter, however proper type variance of complex types is not implemented.\nFor example, functions may be covariant or contravariant of other function types, depending on parameters and return value types:\n\nimage:./snapshot/3_improved_variance_detection.png[image]\n\nEmmyLua does _not_ report the above error.\n\nAdditionally, union variance detection has been fixed:\n\nimage:./snapshot/3_2_improved_variance_detection.png[image]\n\nAs above, the current release of EmmyLua does not catch this error.\n\n=== Primitive literal types\n\nimage:./snapshot/4_primitive_literal_types.png[image]\n\nhttps://github.com/Benjamin-Dobell/LuanalysisTypesDemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/string_literals.lua\n\n=== Generic parameter type usage within function bodies\n\nimage:./snapshot/5_generic_parameters_within_function_bodies.png[image]\n\nhttps://github.com/Benjamin-Dobell/LuanalysisTypesDemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/function_generics_scope.lua\n\n=== Binding of EmmyDoc to lambdas in assignments\n\ni.e. Type checking now works inside function \"lambdas\" assigned to a variable with an EmmyDoc definition.\n\nimage:./snapshot/6_emmydoc_lambda_binding.png[image]\n\nhttps://github.com/Benjamin-Dobell/LuanalysisTypesDemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/lambda_params.lua\n\n=== Table type checking improvements\n\nVarious improvements, for example EmmyDoc \"arrays\" are now assignable to compatible table types e.g.\n\nimage:./snapshot/7_table_improvements.png[image]\n\nThe current EmmyLua release will report an error here even though this is sound.\n\nhttps://github.com/Benjamin-Dobell/LuanalysisTypesDemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/tables.lua\n\n=== Generic classes\n\nimage:./snapshot/8_generic_classes.png[image]\n\nhttps://github.com/Benjamin-Dobell/LuanalysisTypesDemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/generic_class_fields.lua\n\n=== Support for generic params referencing generic params\n\nimage:./snapshot/9_generic_param_relationships.png[image]\n\nhttps://github.com/Benjamin-Dobell/LuanalysisTypesDemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/function_generics.lua#L226-L249\n\n=== Generic inference fixes\n\nThe current EmmyLua release is unable to infer generics correctly in several situations and thus reports type errors where no error exists, and also misses errors where errors should exist e.g.\n\nhttps://github.com/Benjamin-Dobell/LuanalysisTypesDemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/function_generics.lua#L154-L181\n\n=== Type errors are now errors by default\n\nBy default, type safety errors are now reported as errors instead of warnings.\nThis is made feasible by three things:\n\n[arabic]\n. Many improvements in the ability to specify complex types\n. Type safety bug fixes\n. _Casting_\n\nCasting in particular means that if a user is doing something the type system deems unsafe, but they know at runtime will be fine, they can just add a cast to signify this and the error will go away.\n\n=== Generic parameter use _within a class_\n\nimage:./snapshot/10_generic_params_within_classes.png[image]\n\nShadowing of a generic parameter is forbidden and an error reports:\n\nimage:./snapshot/10_2_generic_params_within_classes.png[image]\n\nhttps://github.com/Benjamin-Dobell/LuanalysisTypesDemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/generic_class_scope.lua\n\n=== \"No such member\" inspection\n\nimage:./snapshot/11_no_such_member.png[image]\n\nhttps://github.com/Benjamin-Dobell/LuanalysisTypesDemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/generic_class_fields.lua#L44-L45\n\n=== `self` is a real type\n\nImproved type checking for `self`, for example `self` can be assigned to a variable that matches the parent type of a method.\nHowever, that parent type cannot be assigned to `self`, as the class may be sub-classed (in which case `self` refers to a more specific type).\n\nimage:./snapshot/12_self_type.png[image]\n\nhttps://github.com/Benjamin-Dobell/LuanalysisTypesDemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/self.lua\n\n=== Type checking of immediately assigned variable declarations\n\nimage:./snapshot/13_inspect_variable_declarations.png[image]\n\nCurrent EmmyLua release will allow this invalid assignment.\n\n=== Fixed a bug where the type inference cache was being used in the presence of an index\n\nWhen a function returns multiple values, the current EmmyLua release will infer values and put them in the cache.\nThis is inaccurate as generic types analysis may result in the same generic parameter being resolved differently based on the value being assigned, thus the cache cannot be used in this circumstance.\nPresently this results in both missing errors, and additional inaccurate errors, depending on the assignment.\n\n=== Added support for `@shape`\n\nA shape can be defined similarly to a class, except that contravariance is determined by compatibility of the members _not_ the inheritance hierarchy.\n\nThis is most useful when working with \"structures\" (e.g. JSON) rather than OOP classes.\n\nimage:./snapshot/14_shape.png[image]\n\nhttps://github.com/Benjamin-Dobell/LuanalysisTypesDemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/shape.lua\n\nWhat makes shapes particularly useful is that they support generics and inheritance (at definition time, not assignment) just like classes:\n\nhttps://github.com/Benjamin-Dobell/LuanalysisTypesDemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/shape.lua#L36-L74\n\nEven _better_, type inspections are not just reported on incompatible\n`table`s as whole, but rather the inspections know how to traverse\n_table literals_ and provide detailed annotations of incompatibilities\nbetween two shapes e.g.\n\nimage:./snapshot/14_2_shapes.png[image]\n\n=== Generic Aliases\n\nAliases can now take generic parameters, just like a class or shape.\n\nimage:./snapshot/15_generic_aliases.png[image]\n\nhttps://github.com/Benjamin-Dobell/LuanalysisTypesDemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/generic_alias.lua\n\n=== Improved vararg syntax\n\nFunction types can now use `...: T` as an alternative to `vararg T`:\n\nimage:./snapshot/16_vararg_syntax.png[image]\n\n=== Variadic return values\n\nWe now support variadic return values:\n\nimage:./snapshot/17_variadic_return_values.png[image]\n\nInternally, `TyTuple` has been replaced with `TyMultipleResults` to reflect the fact that this construct is not fixed size.\nAdditionally, multiple results are now properly handled in more locations.\n\n=== Standard library type improvements\n\nVarious improvements to typings of Lua built-ins taking advantage of variadic return values etc.\n\n=== Support for indexed fields\n\nWe can now type all properties of tables, not just string constants.\nGiven that Luanalysis also adds support for primitive literal types we can use this a lot of different ways e.g.\n\nimage:./snapshot/18_indexed_fields.png[image]\n\nHere we have regular string identifier fields, number literal fields\n`[1]`, `[2]` and `[3]` _and_ a `[boolean]` field.\nThat last one is really powerful, because it’s _not_ a constant, it’s a real type.\n\nWe can type custom data structures e.g.\n\n[source,lua]\n----\n---@class Dictionary\u003cK, V\u003e\n---@field [K] V\n----\n\nThis will work correctly for any `K` and everything will be statically type checked as you’d expect.\n\nThere’s also syntax for table types, it works for table literals _and_ anonymous classes (i.e. tables that aren’t explicitly typed):\n\nimage:./snapshot/18_2_indexed_fields.png[image]\n\n=== Partially typed functions\n\nWe now support `fun` types with optional parameter lists and optional return values i.e. `fun: boolean` and `fun(arg: boolean)`. `fun` (with neither specified) also works for posterity but is functionally equivalent to the existing `function` type.\n\nPartially typed functions are extremely useful for implementing callback and handler patterns.\nFor example, it’s quite common to have an extensible event system where each event has unique arguments, but the handler must return `true` to indicate the event was handled:\n\nimage:./snapshot/19_partially_typed_functions.png[image]\n\n=== Callable types\n\nThis is another _really_ useful feature.\nWe can now properly indicate that an object is callable (i.e. is a `table` whose metatable has a\n`__call` method).\n\nimage:./snapshot/20_callable_types.png[image]\n\nThis is done by using the existing `@overload` EmmyDoc keyword, and works similarly i.e. we can specify many overloads and type checking and completion will work as you’d expect:\n\nimage:./snapshot/20_2_callable_types.png[image]\n\n=== Strongly typed tuples\n\nTuples can be implemented as shapes with number literal indexes:\n\nimage:./snapshot/21_tuples.png[image]\n\nor as aliases of table literal types:\n\nimage:./snapshot/21_2_tuples.png[image]\n\nAs can be seen above, when a tuple is compatible with an array, it can be assigned to one, but not vice versa.\n\n=== Type lists\n\nThe `@type` annotation supports a list of types.\nThis can be used when declaring variables:\n\nimage:./snapshot/22_type_lists.png[image]\n\nor for casting multiple results returned by an expression (e.g. function call):\n\nimage:./snapshot/22_2_type_lists.png[image]\n\n=== `@not` type casts\n\nA `@not` type cast eliminates types from a union.\nIt’s useful in a variety of circumstances, the most straight-forward of which is eliminating `nil`:\n\nimage:./snapshot/23_not_casts.png[image]\n\nLike `@type`, is also supports type lists for casting multiple return values of a function, and can itself eliminate unions:\n\nimage:./snapshot/23_2_not_casts.png[image]\n\nWhen you simply want to eliminate types from a union, it’s generally safer to use `@not` cast than a `@type` cast because a `@type` cast essentially disables all type checking for the assignment, where as\n`@not` cast just excludes certain types.\n\n=== `@type` annotations on return statements\n\nReturn statements now accept type annotations, which are _type-safe_ way of typing the return value of anonymous lambdas.\n\nimage:./snapshot/24_type_return_statements.png[image]\n\nUnlike a type cast, these are type-safe:\n\nimage:./snapshot/24_2_type_return_statements.png[image]\n\n=== Recursive alias resolution\n\nAlias types are now lazily resolved, which allows us to type recursive data structures.\nFor example, JSON:\n\nimage:./snapshot/25_recursive_alias.png[image]\n\n=== Casting to/from variadic type lists\n\nA functions API may return an unknown number of results.\nHowever, when calling these functions, you tend to know how many results you expect back.\n\nA variadic return value can be cast to a concrete type list by `@not`\ncasting away `nil`:\n\nimage:./snapshot/26_variadic_casts.png[image]\n\nOne variadic type may also be cast to another:\n\nimage:./snapshot/26_2_variadic_casts.png[image]\n\n=== Support for optional parameters\n\nWe now support optional parameters in both short and long-form function type definitions e.g.\n\nimage:./snapshot/27_optional_params.png[image]\n\nImportantly, optional is _not_ short-hand for `nil | type`.\n\nimage:./snapshot/27_2_optional_params.png[image]\n\nYou cannot provide `nil` unless the optional parameter type itself include `nil` as part of a union in its type definition. This is desirable for\ncorrectness purposes when implementing functions in Lua, say for example if the implementation makes use of\n[`select('#', ...)`](https://www.lua.org/manual/5.3/manual.html#pdf-select). However, beyond that, Lua is regularly used as a scripting language, binding Lua\nfunction calls to implementations in other languages that have support for overloads etc. where the number and type of arguments are important.\n\nInspections that prevent incorrect optional parameter order have also been implemented:\n\nimage:./snapshot/27_3_optional_params.png[image]\n\n== Building from Source\n\nBuild the plugin with:\n\n[source,shell]\n----\n./gradlew build\n----\n\n****\nFor more details about the Jetbrains Platform SDK please refer to the\nhttps://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/setting_up_environment.html[official\ndocumentation].\n****\n\nThe resultant plugin `.zip` will end up in the directory `./build/distributions/`.\n\n== Installation from Source\n\nTo install the `.zip` you built, you’ll need to go to IntelliJ’s…\n\n....\nPreferences -\u003e Plugins -\u003e Settings Cog Icon -\u003e Install Plugin from Disk...\n....\n\nimage:./snapshot/source_install.png[image]\n\nSelect the `.zip`, and then when prompted, restart IntelliJ.\n\n== Developed By\n\nLuanalysis by: https://github.com/Benjamin-Dobell[Benjamin Dobell]\n\nEmmyLua by: https://github.com/tangzx[@tangzx 阿唐]\n\n*Contributors*\n\nPlease\nhttps://github.com/Benjamin-Dobell/IntelliJ-Luanalysis/graphs/contributors[refer\nto Github] for a complete list of contributors.\n\n== Sponsors\n\nThank you to Luanalysis' sponsors and supporters who help ensure the continued development of Luanalysis.\n\n=== Sponsors\n\nimage:https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Sponsor)/sponsor/avatar/0[Sponsor, width=\"35\", link=\"https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Sponsor)/sponsor/profile/0\"]\nimage:https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Sponsor)/sponsor/avatar/1[Sponsor, width=\"35\", link=\"https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Sponsor)/sponsor/profile/1\"]\nimage:https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Sponsor)/sponsor/avatar/2[Sponsor, width=\"35\", link=\"https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Sponsor)/sponsor/profile/2\"]\nimage:https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Sponsor)/sponsor/avatar/3[Sponsor, width=\"35\", link=\"https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Sponsor)/sponsor/profile/3\"]\nimage:https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Sponsor)/sponsor/avatar/4[Sponsor, width=\"35\", link=\"https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Sponsor)/sponsor/profile/4\"]\nimage:https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Sponsor)/sponsor/avatar/5[Sponsor, width=\"35\", link=\"https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Sponsor)/sponsor/profile/5\"]\n\n=== Supporters\n\nimage:https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/avatar/0[Supporter, width=\"35\", link=\"https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/profile/0\"]\nimage:https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/avatar/1[Supporter, width=\"35\", link=\"https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/profile/1\"]\nimage:https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/avatar/2[Supporter, width=\"35\", link=\"https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/profile/2\"]\nimage:https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/avatar/3[Supporter, width=\"35\", link=\"https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/profile/3\"]\nimage:https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/avatar/4[Supporter, width=\"35\", link=\"https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/profile/4\"]\nimage:https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/avatar/5[Supporter, width=\"35\", link=\"https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/profile/5\"]\nimage:https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/avatar/6[Supporter, width=\"35\", link=\"https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/profile/6\"]\nimage:https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/avatar/7[Supporter, width=\"35\", link=\"https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/profile/7\"]\nimage:https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/avatar/8[Supporter, width=\"35\", link=\"https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/profile/8\"]\nimage:https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/avatar/9[Supporter, width=\"35\", link=\"https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/profile/9\"]\nimage:https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/avatar/10[Supporter, width=\"35\", link=\"https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/profile/10\"]\nimage:https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/avatar/11[Supporter, width=\"35\", link=\"https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/profile/11\"]\nimage:https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/avatar/12[Supporter, width=\"35\", link=\"https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/profile/12\"]\nimage:https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/avatar/13[Supporter, width=\"35\", link=\"https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/profile/13\"]\nimage:https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/avatar/14[Supporter, width=\"35\", link=\"https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/profile/14\"]\nimage:https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/avatar/15[Supporter, width=\"35\", link=\"https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/profile/15\"]\nimage:https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/avatar/16[Supporter, width=\"35\", link=\"https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/profile/16\"]\nimage:https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/avatar/17[Supporter, width=\"35\", link=\"https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/profile/17\"]\nimage:https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/avatar/18[Supporter, width=\"35\", link=\"https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/profile/18\"]\nimage:https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/avatar/19[Supporter, width=\"35\", link=\"https://gh-sponsors.herokuapp.com/tier/Luanalysis%20(Supporter)/sponsor/profile/19\"]\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FBenjamin-Dobell%2FIntelliJ-Luanalysis","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FBenjamin-Dobell%2FIntelliJ-Luanalysis","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FBenjamin-Dobell%2FIntelliJ-Luanalysis/lists"}