GithubHelp home page GithubHelp logo

vladrassokhin / intellij-hcl Goto Github PK

View Code? Open in Web Editor NEW
244.0 18.0 49.0 14.22 MB

HCL language support for IntelliJ platform based IDEs

License: Apache License 2.0

Kotlin 68.76% Java 27.66% Lex 1.17% HCL 1.26% HTML 0.23% Makefile 0.02% Shell 0.24% Go 0.66%
hcl intellij-platform terraform intellij-plugin intellij syntax-highlighting

intellij-hcl's Introduction

DEPRECATION NOTICE

This project contains the original source code of the intellij-hcl plugin. The code in this repository is kept static and can be used for historical reference only: no pull requests will be accepted.

Please create new issues (feature requests and bug reports) in IntelliJ IDEA tracker.

New sources can be found in JetBrains/intellij-plugins repository under terraform directory.

You can still download the new versions of the free plugin from JetBrains from the JetBrains plugin repository.

IntelliJ-HCL plugin

Provides HCL language and Terraform configuration files (.tf) support for IntelliJ Platform-based IDEs

The HCL format is used for Nomad(.nomad files).

Plugin page in IntelliJ platform plugin repository.

Note from Plugin Author

I'd been developing this plugin for four years in my free time before last year, when it became obvious that due to lack of free time I could not keep up with the newest Terraform features.

Meanwhile, IaaC and especially Terraform is becoming more and more popular, so I decided to transfer the plugin ownership to JetBrains. I believe that JetBrains has the resources to improve the plugin over time and provide efficient user support.

I'd like to thank all users, contributors, people who spotted and reported bugs, and everyone who promoted the plugin all those years.

As part of the transition, the source code was moved to the main IntelliJ repository which is private. The JetBrains plugin is free. The main plugin features will be compatible with JetBrains' free IDEs ([IntelliJ IDEA, PyCharm]x[Community, Education] Editions) as well as Google's Android Studio. Note that the main features include but are not limited to the features below.

Features:

For both .hcl and .tf file formats:
  • Syntax highlighting
  • Structure outline in the 'Structure' tool window
  • Code formatter with the 'Reformat code' action available
  • Code folding
  • Comment/Uncomment action

Terraform configs (.tf) files

  • Interpolations syntax highlighting
  • (WIP) Properties validation (according to the properties required for resource/provider, type checking)
  • (WIP) Go to definition from resource to provider

Terraform configs Interpolation Language

  • Syntax highlighting
  • Autocompletion for predefined methods
  • (WIP) Go to declaration on resources, providers, properties, etc.

Planned features:

Terraform configs (.tf) files

  • Find usages for resources, providers, variables

Terraform configs Interpolation Language

Terraform External Metadata

Starting from version 0.6.14 it's possible to use external source of Terraform model. Previously plugins updates were necessary once something was updated in Terraform itself or providers.

Plugin reads metadata from specially-formatted json files located at (in order):

  • TERRAFORM_GLOBAL_DIR/schemas (intended for schemas for your custom providers/provisioners) and
  • TERRAFORM_GLOBAL_DIR/metadata-repo/terraform/model (semi-automatically updated schemas) and
  • Plugin itself

Here TERRAFORM_GLOBAL_DIR stands for $HOME/.terraform.d on Linux/macOS and %APPDATA%/terraform.d on Windows.

ℹ️ Recommended approach is to clone special repo as TERRAFORM_GLOBAL_DIR/metadata-repo and later update it from time to time.

⚠️ As of plugin version 0.6.14 IntelliJ restart is required once metadata is updated on disk

Linux/macOS user may use commands like:

# To initial clone
mkdir -p "$HOME/.terraform.d/"
git clone https://github.com/VladRassokhin/terraform-metadata "$HOME/.terraform.d/metadata-repo"

# To update metadata
git -C "$HOME/.terraform.d/metadata-repo" pull
# Don't forget to restart IntelliJ after that

intellij-hcl's People

Contributors

julia-alexandrova avatar matthew16550 avatar paulomigalmeida avatar serceman avatar umanshahzad avatar vladrassokhin avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

intellij-hcl's Issues

EOF object not handled well

If an EOF block is included, such as this example from the Terraform website, everything from the <<EOF to the end of the document is white, with a red error underline at the very end. This occurs even though the Terraform code is handled just fine by Terraform. Could this be fixed?

provisioner "chef"  {
        attributes_json = <<EOF
        {
            "key": "value",
            "app": {
                "cluster1": {
                    "nodes": [
                        "webserver1",
                        "webserver2"
                    ]
                }
            }
        }
        EOF
        environment = "_default"
        run_list = ["cookbook::recipe"]
        node_name = "webserver1"
        secret_key = "${file("../encrypted_data_bag_secret")}"
        server_url = "https://chef.company.com/organizations/org1"
        validation_client_name = "chef-validator"
        validation_key = "${file("../chef-validator.pem")}"
        version = "12.4.1"
    }

Above code is from: https://www.terraform.io/docs/provisioners/chef.html

Support Terraform config files

.tf files is hcl + interpolation language inside ${} inside string elements

Requirements:

  • Support Terraform interpolation language
  • Register .tf file type extension as extended .hcl

Improve .tfvars support

  • Add variables names completion
  • Add mapped variables sub-names completion
  • Report incorrect variable override type: list variable overridden as map and so on
  • Unknown variable overridden inspection
  • Add variables names references resolving
  • Add mapped variables sub-names references resolving

Add file icon

Without an icon files look weird in In a project tree:

image

ClassCastException

Just updated plugin to 4.0

Immediately upon opening my project I get:

8:56:47 AM ClassCastException: org.intellij.plugins.hcl.terraform.il.psi.impl.ILLiteralExpressionImpl cannot be cast to org.intellij.plugins.hcl.terraform.il.psi.ILVariable

This did not happen previously.

Details:

org.intellij.plugins.hcl.terraform.il.psi.impl.ILLiteralExpressionImpl cannot be cast to org.intellij.plugins.hcl.terraform.il.psi.ILVariable
java.lang.ClassCastException: org.intellij.plugins.hcl.terraform.il.psi.impl.ILLiteralExpressionImpl cannot be cast to org.intellij.plugins.hcl.terraform.il.psi.ILVariable
at org.intellij.plugins.hcl.terraform.il.psi.impl.TILPsiImplUtils.getField(TILPsiImplUtils.kt:97)
at org.intellij.plugins.hcl.terraform.il.psi.impl.TILPsiImplUtilJ.getField(TILPsiImplUtilJ.java:76)
at org.intellij.plugins.hcl.terraform.il.psi.impl.ILSelectExpressionImpl.getField(ILSelectExpressionImpl.java:33)
at org.intellij.plugins.hcl.terraform.il.psi.ILSelectFromSomethingReferenceProviderKt.getGoodLeftElement(ILSelectFromSomethingReferenceProvider.kt:110)
at org.intellij.plugins.hcl.terraform.il.psi.ILSelectFromSomethingReferenceProvider.getReferencesByElement(ILSelectFromSomethingReferenceProvider.kt:45)
at com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistryImpl.doGetReferencesFromProviders(ReferenceProvidersRegistryImpl.java:124)
at com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistry.getReferencesFromProviders(ReferenceProvidersRegistry.java:70)
at com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistry.getReferencesFromProviders(ReferenceProvidersRegistry.java:61)
at org.intellij.plugins.hcl.terraform.il.psi.impl.ILExpressionWithReference.getReferences(ILExpressionWithReference.kt:26)
at org.intellij.plugins.intelliLang.references.InjectedReferencesContributor.getInjectedReferences(InjectedReferencesContributor.java:55)
at org.intellij.plugins.intelliLang.references.InjectedReferencesInspection$1.visitElement(InjectedReferencesInspection.java:38)
at org.intellij.plugins.hcl.terraform.il.psi.impl.ILExpressionBase.accept(ILExpressionBase.kt:35)
at org.intellij.plugins.hcl.terraform.il.psi.impl.ILVariableImpl.accept(ILVariableImpl.java:24)
at com.intellij.codeInspection.InspectionEngine.acceptElements(InspectionEngine.java:80)
at com.intellij.codeInspection.InspectionEngine.createVisitorAndAcceptElements(InspectionEngine.java:69)
at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.a(LocalInspectionsPass.java:687)
at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.access$1100(LocalInspectionsPass.java:75)
at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass$6.process(LocalInspectionsPass.java:347)
at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass$6.process(LocalInspectionsPass.java:344)
at com.intellij.concurrency.ApplierCompleter.a(ApplierCompleter.java:122)
at com.intellij.concurrency.ApplierCompleter.c(ApplierCompleter.java:211)
at com.intellij.concurrency.ApplierCompleter.a(ApplierCompleter.java:140)
at com.intellij.concurrency.ApplierCompleter.access$000(ApplierCompleter.java:44)
at com.intellij.concurrency.ApplierCompleter$1.run(ApplierCompleter.java:85)
at com.intellij.openapi.application.impl.ApplicationImpl.tryRunReadAction(ApplicationImpl.java:1098)
at com.intellij.concurrency.ApplierCompleter$2.run(ApplierCompleter.java:94)
at com.intellij.openapi.progress.impl.CoreProgressManager.a(CoreProgressManager.java:452)
at com.intellij.openapi.progress.impl.CoreProgressManager.a(CoreProgressManager.java:449)
at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:402)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:54)
at com.intellij.concurrency.ApplierCompleter.a(ApplierCompleter.java:106)
at com.intellij.concurrency.ApplierCompleter.compute(ApplierCompleter.java:82)
at jsr166e.CountedCompleter.exec(CountedCompleter.java:684)
at jsr166e.ForkJoinTask.doExec(ForkJoinTask.java:260)
at jsr166e.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:858)
at jsr166e.ForkJoinPool.scan(ForkJoinPool.java:1687)
at jsr166e.ForkJoinPool.runWorker(ForkJoinPool.java:1642)
at jsr166e.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:109)

Interpolation escape not supported

Please add support for escaping interpolation syntax:

You can escape interpolation with double dollar signs: $${foo} will be rendered as a literal ${foo} [1]

Example use case:
"Resource": "arn:aws:s3:::mybucket/$${cognito-identity.amazonaws.com:sub}/*"

Support for terraform 0.7.0 map data type overrides in .tfvars

Terraform 0.7.0 brought better support for map data types and a changed syntax for overriding the defaults/providing values in .tfvars files. The new syntax appears not to be supported by this plugin.

Example map:

variable "myMap" {
  type = "map"
  default = {
    foo = "bar"
    hello = "world"
  }
}

Old syntax for providing values from .tfvars file:
myMap.foo = "banana"

New syntax (as of terraform 0.7.0) for providing values from .tfvars files:

myMap = {
  foo = "banana"
}

The plugin currently highlights the new syntax as erroneous and reports:

Property value should be either number or double quoted string in .tfvars files less... (⌘F1)
The vars file should be in the format of key = \"value\"

Highlight matching bracket signs

In other languages when I point a cursor to beginning of a block, an end of the block is highlighted:
image

Would be nice to have it enabled in HCL.

'id' property reported as unresolved

In Terraform config:

resource atlas_artifact a1 {
  name = "${atlas_artifact.a1.id}"
}

id highlighted as unresolved reference. Actually id is predefined one in all resources.

Formatting on EOF tokens produces a bad syntax output

Hi,

Given the following example:

resource "aws_iam_role_policy" "test_policy" {
    name = "test_policy"
    role = "${aws_iam_role.test_role.id}"
    policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "ec2:Describe*"
      ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}
EOF
}

resource "aws_iam_role" "test_role" {
    name = "test_role"
    assume_role_policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Effect": "Allow",
      "Sid": ""
    }
  ]
}
EOF
}

the EOF token is not registered correctly and thus the formatter is wrong (and highlighter as well).

It would be cool if <<EOF - EOF would be marked as a string so and injections would be provided so that JSON could be inserted as a language there thus providing highlighting there as well.

Thank you for the work on the plugin!

Crash when opening a terraform file with invalid syntax

Example:
`
source = "/foo/bar"

foo_

baz = true
}
`

Stacktrace:
Expected not null PVA, node PROPERTY, parent FILE java.lang.AssertionError: Expected not null PVA, node PROPERTY, parent FILE at org.intellij.plugins.hcl.formatter.HCLBlock.makeSubBlock(HCLBlock.kt:180) at org.intellij.plugins.hcl.formatter.HCLBlock.buildChildren(HCLBlock.kt:50) at com.intellij.psi.formatter.common.AbstractBlock.getSubBlocks(AbstractBlock.java:62) at com.intellij.psi.codeStyle.autodetect.FormatterBasedLineIndentInfoBuilder.a(FormatterBasedLineIndentInfoBuilder.java:119) at com.intellij.psi.codeStyle.autodetect.FormatterBasedLineIndentInfoBuilder.a(FormatterBasedLineIndentInfoBuilder.java:76) at com.intellij.psi.codeStyle.autodetect.FormatterBasedLineIndentInfoBuilder.access$200(FormatterBasedLineIndentInfoBuilder.java:35) at com.intellij.psi.codeStyle.autodetect.FormatterBasedLineIndentInfoBuilder$1.fun(FormatterBasedLineIndentInfoBuilder.java:62) at com.intellij.psi.codeStyle.autodetect.FormatterBasedLineIndentInfoBuilder$1.fun(FormatterBasedLineIndentInfoBuilder.java:51) at com.intellij.util.containers.ContainerUtil.map(ContainerUtil.java:1796) at com.intellij.psi.codeStyle.autodetect.FormatterBasedLineIndentInfoBuilder.build(FormatterBasedLineIndentInfoBuilder.java:51) at com.intellij.psi.codeStyle.autodetect.IndentOptionsDetectorImpl.a(IndentOptionsDetectorImpl.java:73) at com.intellij.psi.codeStyle.autodetect.IndentOptionsDetectorImpl.getIndentOptions(IndentOptionsDetectorImpl.java:56) at com.intellij.psi.codeStyle.autodetect.DetectableIndentOptionsProvider.getIndentOptions(DetectableIndentOptionsProvider.java:56) at com.intellij.psi.codeStyle.CodeStyleSettings.getIndentOptionsByFile(CodeStyleSettings.java:672) at com.intellij.psi.codeStyle.CodeStyleSettingsManager.updateDocumentIndentOptions(CodeStyleSettingsManager.java:145) at com.intellij.openapi.editor.impl.SettingsImpl.a(SettingsImpl.java:345) at com.intellij.openapi.editor.impl.SettingsImpl.reinitSettings(SettingsImpl.java:319) at com.intellij.openapi.editor.impl.EditorImpl.reinitSettings(EditorImpl.java:795) at com.intellij.openapi.editor.impl.EditorImpl.setHighlighter(EditorImpl.java:1186) at com.intellij.openapi.fileEditor.impl.text.TextEditorComponent.i(TextEditorComponent.java:168) at com.intellij.openapi.fileEditor.impl.text.TextEditorComponent.<init>(TextEditorComponent.java:100) at com.intellij.openapi.fileEditor.impl.text.PsiAwareTextEditorImpl$PsiAwareTextEditorComponent.<init>(PsiAwareTextEditorImpl.java:62) at com.intellij.openapi.fileEditor.impl.text.PsiAwareTextEditorImpl$PsiAwareTextEditorComponent.<init>(PsiAwareTextEditorImpl.java:55) at com.intellij.openapi.fileEditor.impl.text.PsiAwareTextEditorImpl.createEditorComponent(PsiAwareTextEditorImpl.java:44) at com.intellij.openapi.fileEditor.impl.text.TextEditorImpl.<init>(TextEditorImpl.java:46) at com.intellij.openapi.fileEditor.impl.text.PsiAwareTextEditorImpl.<init>(PsiAwareTextEditorImpl.java:38) at com.intellij.openapi.fileEditor.impl.text.PsiAwareTextEditorProvider$1.build(PsiAwareTextEditorProvider.java:77) at com.intellij.openapi.fileEditor.impl.FileEditorManagerImpl$13.run(FileEditorManagerImpl.java:873) at com.intellij.util.ui.UIUtil.invokeAndWaitIfNeeded(UIUtil.java:2382) at com.intellij.openapi.fileEditor.impl.FileEditorManagerImpl.openFileImpl4(FileEditorManagerImpl.java:855) at com.intellij.openapi.fileEditor.impl.FileEditorManagerImpl.openFileImpl3(FileEditorManagerImpl.java:789) at com.intellij.openapi.fileEditor.impl.FileEditorManagerImpl$10.run(FileEditorManagerImpl.java:769) at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:124) at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:99) at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:85) at com.intellij.openapi.fileEditor.impl.FileEditorManagerImpl.openFileImpl2(FileEditorManagerImpl.java:766) at com.intellij.openapi.fileEditor.impl.FileEditorManagerImpl.openFileWithProviders(FileEditorManagerImpl.java:707) at com.intellij.openapi.fileEditor.ex.FileEditorManagerEx.openFile(FileEditorManagerEx.java:151) at com.intellij.codeInsight.navigation.NavigationUtil.a(NavigationUtil.java:200) at com.intellij.codeInsight.navigation.NavigationUtil.openFileWithPsiElement(NavigationUtil.java:176) at com.intellij.ide.projectView.impl.nodes.AbstractPsiBasedNode.navigate(AbstractPsiBasedNode.java:207) at com.intellij.ide.projectView.impl.nodes.AbstractPsiBasedNode.navigate(AbstractPsiBasedNode.java:217) at com.intellij.ide.projectView.impl.nodes.PsiFileNode.navigate(PsiFileNode.java:132) at com.intellij.util.OpenSourceUtil.navigate(OpenSourceUtil.java:53) at com.intellij.util.OpenSourceUtil.openSourcesFrom(OpenSourceUtil.java:31) at com.intellij.util.EditSourceOnDoubleClickHandler$TreeMouseListener.processDoubleClick(EditSourceOnDoubleClickHandler.java:130) at com.intellij.util.EditSourceOnDoubleClickHandler$TreeMouseListener.onDoubleClick(EditSourceOnDoubleClickHandler.java:122) at com.intellij.ui.DoubleClickListener.onClick(DoubleClickListener.java:30) at com.intellij.ui.ClickListener$1.mouseReleased(ClickListener.java:73) at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:290) at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:289) at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:289) at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:289) at java.awt.Component.processMouseEvent(Component.java:6535) at javax.swing.JComponent.processMouseEvent(JComponent.java:3324) at com.intellij.ui.treeStructure.Tree.processMouseEvent(Tree.java:410) at com.intellij.ide.dnd.aware.DnDAwareTree.processMouseEvent(DnDAwareTree.java:58) at java.awt.Component.processEvent(Component.java:6300) at java.awt.Container.processEvent(Container.java:2236) at java.awt.Component.dispatchEventImpl(Component.java:4891) at java.awt.Container.dispatchEventImpl(Container.java:2294) at java.awt.Component.dispatchEvent(Component.java:4713) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466) at java.awt.Container.dispatchEventImpl(Container.java:2280) at java.awt.Window.dispatchEventImpl(Window.java:2750) at java.awt.Component.dispatchEvent(Component.java:4713) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758) at java.awt.EventQueue.access$500(EventQueue.java:97) at java.awt.EventQueue$3.run(EventQueue.java:709) at java.awt.EventQueue$3.run(EventQueue.java:703) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) at java.awt.EventQueue$4.run(EventQueue.java:731) at java.awt.EventQueue$4.run(EventQueue.java:729) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) at java.awt.EventQueue.dispatchEvent(EventQueue.java:728) at com.intellij.ide.IdeEventQueue.e(IdeEventQueue.java:866) at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:650) at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:381) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Thanks for the plugin! Let me know if I can help track something down.

Pressing 'Enter' indents to position 9

I have a perfectly valid .tf file. Pressing the Enter key outside of any resource definition (so, at the root), indents the new line to position 9. This is very annoying, and I don't seem to get rid of it.

I went through the Code style settings in my IntelliJ, but nothing seems to apply or resolve this.

Can you have a look at this?

Context:

  • Mac OS X 10.10.5
  • IntelliJ Ultimate 14.1.3
  • HCL plugin 0.2.7

Error on Refactor-Rename

Most recent version. Here's the error as reported by IntelliJ. Consistently reproducible.

null
java.lang.AssertionError
at com.intellij.psi.impl.source.tree.injected.InjectedFileViewProvider.rootChanged(InjectedFileViewProvider.java:71)
at com.intellij.psi.impl.source.PsiFileImpl.subtreeChanged(PsiFileImpl.java:440)
at com.intellij.psi.impl.source.tree.CompositeElement.subtreeChanged(CompositeElement.java:100)
at com.intellij.psi.impl.source.tree.ChangeUtil$1.runInner(ChangeUtil.java:177)
at com.intellij.pom.impl.PomTransactionBase.run(PomTransactionBase.java:44)
at com.intellij.pom.core.impl.PomModelImpl.runTransaction(PomModelImpl.java:153)
at com.intellij.psi.impl.source.tree.ChangeUtil.prepareAndRunChangeAction(ChangeUtil.java:167)
at com.intellij.psi.impl.source.tree.CompositeElement.replaceChild(CompositeElement.java:709)
at com.intellij.psi.impl.source.codeStyle.CodeEditUtil.replaceChild(CodeEditUtil.java:204)
at com.intellij.extapi.psi.ASTDelegatePsiElement.replaceChildInternal(ASTDelegatePsiElement.java:388)
at com.intellij.extapi.psi.ASTDelegatePsiElement.replace(ASTDelegatePsiElement.java:378)
at org.intellij.plugins.hil.psi.ILVariableManipulator.handleContentChange(ILVariableManipulator.kt:28)
at org.intellij.plugins.hil.psi.ILVariableManipulator.handleContentChange(ILVariableManipulator.kt:22)
at com.intellij.psi.PsiReferenceBase.handleElementRename(PsiReferenceBase.java:118)
at com.intellij.refactoring.rename.RenameUtil.rename(RenameUtil.java:269)
at com.intellij.refactoring.rename.RenameUtil.doRenameGenericNamedElement(RenameUtil.java:226)
at com.intellij.refactoring.rename.RenamePsiElementProcessor.renameElement(RenamePsiElementProcessor.java:60)
at com.intellij.refactoring.rename.RenameUtil.doRename(RenameUtil.java:187)
at com.intellij.refactoring.rename.RenameProcessor.performRefactoring(RenameProcessor.java:413)
at com.intellij.refactoring.BaseRefactoringProcessor$7.run(BaseRefactoringProcessor.java:470)
at com.intellij.openapi.application.impl.ApplicationImpl.runWriteAction(ApplicationImpl.java:1009)
at com.intellij.refactoring.BaseRefactoringProcessor.doRefactoring(BaseRefactoringProcessor.java:452)
at com.intellij.refactoring.BaseRefactoringProcessor.access$100(BaseRefactoringProcessor.java:75)
at com.intellij.refactoring.BaseRefactoringProcessor$3.run(BaseRefactoringProcessor.java:292)
at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:117)
at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:99)
at com.intellij.refactoring.BaseRefactoringProcessor.execute(BaseRefactoringProcessor.java:288)
at com.intellij.refactoring.BaseRefactoringProcessor$5.run(BaseRefactoringProcessor.java:403)
at com.intellij.usages.impl.UsageViewImpl$MyPerformOperationRunnable$1.run(UsageViewImpl.java:1741)
at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:124)
at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:99)
at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:85)
at com.intellij.usages.impl.UsageViewImpl$MyPerformOperationRunnable.run(UsageViewImpl.java:1737)
at com.intellij.usages.impl.UsageViewImpl$ButtonPanel$1.actionPerformed(UsageViewImpl.java:1649)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6535)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
at java.awt.Component.processEvent(Component.java:6300)
at java.awt.Container.processEvent(Container.java:2236)
at java.awt.Component.dispatchEventImpl(Component.java:4891)
at java.awt.Container.dispatchEventImpl(Container.java:2294)
at java.awt.Component.dispatchEvent(Component.java:4713)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
at java.awt.Container.dispatchEventImpl(Container.java:2280)
at java.awt.Window.dispatchEventImpl(Window.java:2750)
at java.awt.Component.dispatchEvent(Component.java:4713)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.awt.EventQueue$4.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:857)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:654)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:386)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Add support for Data Sources

As of Terraform 0.7, Data Sources like template_file should now be declared as data instead of resource.

Currently, this plugin shows this as an error "Unknown block type data".

Would be awesome to get this updated, I am happy to help if someone can point me in the right direction! Thanks.

Auto-create closing quotes

When I type opening quotation sign (" or '), editor usually adds a second closing sign automatically.
Please enable this mode for HCL.

Plugin Crashing

I'm using Rubymines 7.1.4 on Mac OSX 10.11.1 I'm getting the below error.

Not sure why i'm getting this. i have my terraform project up and it seems fine. everything is working great.

com/intellij/psi/impl/source/tree/injected/StringLiteralEscaper
java.lang.NoClassDefFoundError: com/intellij/psi/impl/source/tree/injected/StringLiteralEscaper
at org.intellij.plugins.hcl.psi.impl.HCLStringLiteralMixin.createLiteralTextEscaper(HCLStringLiteralMixin.kt:35)
at com.intellij.psi.impl.source.tree.injected.MultiHostRegistrarImpl.addPlace(MultiHostRegistrarImpl.java:169)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageManagerImpl$PsiManagerRegisteredInjectorsAdapter$1.addPlace(InjectedLanguageManagerImpl.java:477)
at org.intellij.plugins.hcl.terraform.il.ILLanguageInjector.getStringLiteralInjections(Injector.kt:48)
at org.intellij.plugins.hcl.terraform.il.ILLanguageInjector.getLanguagesToInject(Injector.kt:36)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageManagerImpl$PsiManagerRegisteredInjectorsAdapter.getLanguagesToInject(InjectedLanguageManagerImpl.java:484)
at com.intellij.psi.impl.source.tree.injected.InjectedPsiCachedValueProvider$MyInjProcessor.process(InjectedPsiCachedValueProvider.java:82)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageManagerImpl.processInPlaceInjectorsFor(InjectedLanguageManagerImpl.java:443)
at com.intellij.psi.impl.source.tree.injected.InjectedPsiCachedValueProvider.doCompute(InjectedPsiCachedValueProvider.java:62)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.a(InjectedLanguageUtil.java:315)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.enumerate(InjectedLanguageUtil.java:144)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.a(InjectedLanguageUtil.java:413)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.a(InjectedLanguageUtil.java:399)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.findInjectedElementNoCommit(InjectedLanguageUtil.java:371)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.findInjectedPsiNoCommit(InjectedLanguageUtil.java:271)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.getEditorForInjectedLanguageNoCommit(InjectedLanguageUtil.java:233)
at com.intellij.codeInsight.navigation.CtrlMouseHandler$5.mouseMoved(CtrlMouseHandler.java:212)
at sun.reflect.GeneratedMethodAccessor36.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.util.EventDispatcher.dispatch(EventDispatcher.java:88)
at com.intellij.util.EventDispatcher.access$100(EventDispatcher.java:34)
at com.intellij.util.EventDispatcher$1.invoke(EventDispatcher.java:68)
at com.sun.proxy.$Proxy25.mouseMoved(Unknown Source)
at com.intellij.openapi.editor.impl.EditorImpl$MyMouseMotionListener.mouseMoved(EditorImpl.java:6058)
at java.awt.Component.processMouseMotionEvent(Component.java:6588)
at javax.swing.JComponent.processMouseMotionEvent(JComponent.java:3342)
at java.awt.Component.processEvent(Component.java:6312)
at java.awt.Container.processEvent(Container.java:2235)
at java.awt.Component.dispatchEventImpl(Component.java:4899)
at java.awt.Container.dispatchEventImpl(Container.java:2293)
at java.awt.Component.dispatchEvent(Component.java:4721)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4897)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4545)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4461)
at java.awt.Container.dispatchEventImpl(Container.java:2279)
at java.awt.Window.dispatchEventImpl(Window.java:2750)
at java.awt.Component.dispatchEvent(Component.java:4721)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:751)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:702)
at java.awt.EventQueue$3.run(EventQueue.java:696)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:724)
at java.awt.EventQueue$4.run(EventQueue.java:722)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:721)
at com.intellij.ide.IdeEventQueue.e(IdeEventQueue.java:734)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:565)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:382)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

java.lang.NoClassDefFoundError: com/intellij/psi/impl/source/tree/injected/StringLiteralEscaper
at org.intellij.plugins.hcl.psi.impl.HCLStringLiteralMixin.createLiteralTextEscaper(HCLStringLiteralMixin.kt:35)
at com.intellij.psi.impl.source.tree.injected.MultiHostRegistrarImpl.addPlace(MultiHostRegistrarImpl.java:169)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageManagerImpl$PsiManagerRegisteredInjectorsAdapter$1.addPlace(InjectedLanguageManagerImpl.java:477)
at org.intellij.plugins.hcl.terraform.il.ILLanguageInjector.getStringLiteralInjections(Injector.kt:48)
at org.intellij.plugins.hcl.terraform.il.ILLanguageInjector.getLanguagesToInject(Injector.kt:36)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageManagerImpl$PsiManagerRegisteredInjectorsAdapter.getLanguagesToInject(InjectedLanguageManagerImpl.java:484)
at com.intellij.psi.impl.source.tree.injected.InjectedPsiCachedValueProvider$MyInjProcessor.process(InjectedPsiCachedValueProvider.java:82)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageManagerImpl.processInPlaceInjectorsFor(InjectedLanguageManagerImpl.java:443)
at com.intellij.psi.impl.source.tree.injected.InjectedPsiCachedValueProvider.doCompute(InjectedPsiCachedValueProvider.java:62)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.a(InjectedLanguageUtil.java:315)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.enumerate(InjectedLanguageUtil.java:144)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.a(InjectedLanguageUtil.java:413)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.a(InjectedLanguageUtil.java:399)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.findInjectedElementNoCommit(InjectedLanguageUtil.java:371)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.findInjectedPsiNoCommit(InjectedLanguageUtil.java:271)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.getEditorForInjectedLanguageNoCommit(InjectedLanguageUtil.java:233)
at com.intellij.codeInsight.navigation.CtrlMouseHandler$5.mouseMoved(CtrlMouseHandler.java:212)
at sun.reflect.GeneratedMethodAccessor36.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.util.EventDispatcher.dispatch(EventDispatcher.java:88)
at com.intellij.util.EventDispatcher.access$100(EventDispatcher.java:34)
at com.intellij.util.EventDispatcher$1.invoke(EventDispatcher.java:68)
at com.sun.proxy.$Proxy25.mouseMoved(Unknown Source)
at com.intellij.openapi.editor.impl.EditorImpl$MyMouseMotionListener.mouseMoved(EditorImpl.java:6058)
at java.awt.Component.processMouseMotionEvent(Component.java:6588)
at javax.swing.JComponent.processMouseMotionEvent(JComponent.java:3342)
at java.awt.Component.processEvent(Component.java:6312)
at java.awt.Container.processEvent(Container.java:2235)
at java.awt.Component.dispatchEventImpl(Component.java:4899)
at java.awt.Container.dispatchEventImpl(Container.java:2293)
at java.awt.Component.dispatchEvent(Component.java:4721)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4897)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4545)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4461)
at java.awt.Container.dispatchEventImpl(Container.java:2279)
at java.awt.Window.dispatchEventImpl(Window.java:2750)
at java.awt.Component.dispatchEvent(Component.java:4721)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:751)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:702)
at java.awt.EventQueue$3.run(EventQueue.java:696)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:724)
at java.awt.EventQueue$4.run(EventQueue.java:722)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:721)
at com.intellij.ide.IdeEventQueue.e(IdeEventQueue.java:734)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:565)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:382)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

java.lang.NoClassDefFoundError: com/intellij/psi/impl/source/tree/injected/StringLiteralEscaper
at org.intellij.plugins.hcl.psi.impl.HCLStringLiteralMixin.createLiteralTextEscaper(HCLStringLiteralMixin.kt:35)
at com.intellij.psi.impl.source.tree.injected.MultiHostRegistrarImpl.addPlace(MultiHostRegistrarImpl.java:169)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageManagerImpl$PsiManagerRegisteredInjectorsAdapter$1.addPlace(InjectedLanguageManagerImpl.java:477)
at org.intellij.plugins.hcl.terraform.il.ILLanguageInjector.getStringLiteralInjections(Injector.kt:48)
at org.intellij.plugins.hcl.terraform.il.ILLanguageInjector.getLanguagesToInject(Injector.kt:36)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageManagerImpl$PsiManagerRegisteredInjectorsAdapter.getLanguagesToInject(InjectedLanguageManagerImpl.java:484)
at com.intellij.psi.impl.source.tree.injected.InjectedPsiCachedValueProvider$MyInjProcessor.process(InjectedPsiCachedValueProvider.java:82)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageManagerImpl.processInPlaceInjectorsFor(InjectedLanguageManagerImpl.java:443)
at com.intellij.psi.impl.source.tree.injected.InjectedPsiCachedValueProvider.doCompute(InjectedPsiCachedValueProvider.java:62)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.a(InjectedLanguageUtil.java:315)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.enumerate(InjectedLanguageUtil.java:144)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.a(InjectedLanguageUtil.java:413)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.a(InjectedLanguageUtil.java:399)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.findInjectedElementNoCommit(InjectedLanguageUtil.java:371)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.findInjectedPsiNoCommit(InjectedLanguageUtil.java:271)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.getEditorForInjectedLanguageNoCommit(InjectedLanguageUtil.java:233)
at com.intellij.codeInsight.navigation.CtrlMouseHandler$5.mouseMoved(CtrlMouseHandler.java:212)
at sun.reflect.GeneratedMethodAccessor36.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.util.EventDispatcher.dispatch(EventDispatcher.java:88)
at com.intellij.util.EventDispatcher.access$100(EventDispatcher.java:34)
at com.intellij.util.EventDispatcher$1.invoke(EventDispatcher.java:68)
at com.sun.proxy.$Proxy25.mouseMoved(Unknown Source)
at com.intellij.openapi.editor.impl.EditorImpl$MyMouseMotionListener.mouseMoved(EditorImpl.java:6058)
at java.awt.Component.processMouseMotionEvent(Component.java:6588)
at javax.swing.JComponent.processMouseMotionEvent(JComponent.java:3342)
at java.awt.Component.processEvent(Component.java:6312)
at java.awt.Container.processEvent(Container.java:2235)
at java.awt.Component.dispatchEventImpl(Component.java:4899)
at java.awt.Container.dispatchEventImpl(Container.java:2293)
at java.awt.Component.dispatchEvent(Component.java:4721)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4897)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4545)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4461)
at java.awt.Container.dispatchEventImpl(Container.java:2279)
at java.awt.Window.dispatchEventImpl(Window.java:2750)
at java.awt.Component.dispatchEvent(Component.java:4721)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:751)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:702)
at java.awt.EventQueue$3.run(EventQueue.java:696)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:724)
at java.awt.EventQueue$4.run(EventQueue.java:722)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:721)
at com.intellij.ide.IdeEventQueue.e(IdeEventQueue.java:734)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:565)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:382)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

java.lang.NoClassDefFoundError: com/intellij/psi/impl/source/tree/injected/StringLiteralEscaper
at org.intellij.plugins.hcl.psi.impl.HCLStringLiteralMixin.createLiteralTextEscaper(HCLStringLiteralMixin.kt:35)
at com.intellij.psi.impl.source.tree.injected.MultiHostRegistrarImpl.addPlace(MultiHostRegistrarImpl.java:169)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageManagerImpl$PsiManagerRegisteredInjectorsAdapter$1.addPlace(InjectedLanguageManagerImpl.java:477)
at org.intellij.plugins.hcl.terraform.il.ILLanguageInjector.getStringLiteralInjections(Injector.kt:48)
at org.intellij.plugins.hcl.terraform.il.ILLanguageInjector.getLanguagesToInject(Injector.kt:36)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageManagerImpl$PsiManagerRegisteredInjectorsAdapter.getLanguagesToInject(InjectedLanguageManagerImpl.java:484)
at com.intellij.psi.impl.source.tree.injected.InjectedPsiCachedValueProvider$MyInjProcessor.process(InjectedPsiCachedValueProvider.java:82)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageManagerImpl.processInPlaceInjectorsFor(InjectedLanguageManagerImpl.java:443)
at com.intellij.psi.impl.source.tree.injected.InjectedPsiCachedValueProvider.doCompute(InjectedPsiCachedValueProvider.java:62)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.a(InjectedLanguageUtil.java:315)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.enumerate(InjectedLanguageUtil.java:144)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.a(InjectedLanguageUtil.java:413)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.a(InjectedLanguageUtil.java:399)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.findInjectedElementNoCommit(InjectedLanguageUtil.java:371)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.findInjectedPsiNoCommit(InjectedLanguageUtil.java:271)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.getEditorForInjectedLanguageNoCommit(InjectedLanguageUtil.java:233)
at com.intellij.codeInsight.navigation.CtrlMouseHandler$5.mouseMoved(CtrlMouseHandler.java:212)
at sun.reflect.GeneratedMethodAccessor36.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.util.EventDispatcher.dispatch(EventDispatcher.java:88)
at com.intellij.util.EventDispatcher.access$100(EventDispatcher.java:34)
at com.intellij.util.EventDispatcher$1.invoke(EventDispatcher.java:68)
at com.sun.proxy.$Proxy25.mouseMoved(Unknown Source)
at com.intellij.openapi.editor.impl.EditorImpl$MyMouseMotionListener.mouseMoved(EditorImpl.java:6058)
at java.awt.Component.processMouseMotionEvent(Component.java:6588)
at javax.swing.JComponent.processMouseMotionEvent(JComponent.java:3342)
at java.awt.Component.processEvent(Component.java:6312)
at java.awt.Container.processEvent(Container.java:2235)
at java.awt.Component.dispatchEventImpl(Component.java:4899)
at java.awt.Container.dispatchEventImpl(Container.java:2293)
at java.awt.Component.dispatchEvent(Component.java:4721)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4897)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4545)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4461)
at java.awt.Container.dispatchEventImpl(Container.java:2279)
at java.awt.Window.dispatchEventImpl(Window.java:2750)
at java.awt.Component.dispatchEvent(Component.java:4721)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:751)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:702)
at java.awt.EventQueue$3.run(EventQueue.java:696)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:724)
at java.awt.EventQueue$4.run(EventQueue.java:722)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:721)
at com.intellij.ide.IdeEventQueue.e(IdeEventQueue.java:734)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:565)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:382)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

java.lang.NoClassDefFoundError: com/intellij/psi/impl/source/tree/injected/StringLiteralEscaper
at org.intellij.plugins.hcl.psi.impl.HCLStringLiteralMixin.createLiteralTextEscaper(HCLStringLiteralMixin.kt:35)
at com.intellij.psi.impl.source.tree.injected.MultiHostRegistrarImpl.addPlace(MultiHostRegistrarImpl.java:169)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageManagerImpl$PsiManagerRegisteredInjectorsAdapter$1.addPlace(InjectedLanguageManagerImpl.java:477)
at org.intellij.plugins.hcl.terraform.il.ILLanguageInjector.getStringLiteralInjections(Injector.kt:48)
at org.intellij.plugins.hcl.terraform.il.ILLanguageInjector.getLanguagesToInject(Injector.kt:36)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageManagerImpl$PsiManagerRegisteredInjectorsAdapter.getLanguagesToInject(InjectedLanguageManagerImpl.java:484)
at com.intellij.psi.impl.source.tree.injected.InjectedPsiCachedValueProvider$MyInjProcessor.process(InjectedPsiCachedValueProvider.java:82)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageManagerImpl.processInPlaceInjectorsFor(InjectedLanguageManagerImpl.java:443)
at com.intellij.psi.impl.source.tree.injected.InjectedPsiCachedValueProvider.doCompute(InjectedPsiCachedValueProvider.java:62)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.a(InjectedLanguageUtil.java:315)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.enumerate(InjectedLanguageUtil.java:144)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.a(InjectedLanguageUtil.java:413)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.a(InjectedLanguageUtil.java:399)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.findInjectedElementNoCommit(InjectedLanguageUtil.java:371)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.findInjectedPsiNoCommit(InjectedLanguageUtil.java:271)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.getEditorForInjectedLanguageNoCommit(InjectedLanguageUtil.java:233)
at com.intellij.codeInsight.navigation.CtrlMouseHandler$5.mouseMoved(CtrlMouseHandler.java:212)
at sun.reflect.GeneratedMethodAccessor36.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.util.EventDispatcher.dispatch(EventDispatcher.java:88)
at com.intellij.util.EventDispatcher.access$100(EventDispatcher.java:34)
at com.intellij.util.EventDispatcher$1.invoke(EventDispatcher.java:68)
at com.sun.proxy.$Proxy25.mouseMoved(Unknown Source)
at com.intellij.openapi.editor.impl.EditorImpl$MyMouseMotionListener.mouseMoved(EditorImpl.java:6058)
at java.awt.Component.processMouseMotionEvent(Component.java:6588)
at javax.swing.JComponent.processMouseMotionEvent(JComponent.java:3342)
at java.awt.Component.processEvent(Component.java:6312)
at java.awt.Container.processEvent(Container.java:2235)
at java.awt.Component.dispatchEventImpl(Component.java:4899)
at java.awt.Container.dispatchEventImpl(Container.java:2293)
at java.awt.Component.dispatchEvent(Component.java:4721)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4897)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4545)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4461)
at java.awt.Container.dispatchEventImpl(Container.java:2279)
at java.awt.Window.dispatchEventImpl(Window.java:2750)
at java.awt.Component.dispatchEvent(Component.java:4721)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:751)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:702)
at java.awt.EventQueue$3.run(EventQueue.java:696)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:724)
at java.awt.EventQueue$4.run(EventQueue.java:722)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:721)
at com.intellij.ide.IdeEventQueue.e(IdeEventQueue.java:734)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:565)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:382)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

java.lang.NoClassDefFoundError: com/intellij/psi/impl/source/tree/injected/StringLiteralEscaper
at org.intellij.plugins.hcl.psi.impl.HCLStringLiteralMixin.createLiteralTextEscaper(HCLStringLiteralMixin.kt:35)
at com.intellij.psi.impl.source.tree.injected.MultiHostRegistrarImpl.addPlace(MultiHostRegistrarImpl.java:169)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageManagerImpl$PsiManagerRegisteredInjectorsAdapter$1.addPlace(InjectedLanguageManagerImpl.java:477)
at org.intellij.plugins.hcl.terraform.il.ILLanguageInjector.getStringLiteralInjections(Injector.kt:48)
at org.intellij.plugins.hcl.terraform.il.ILLanguageInjector.getLanguagesToInject(Injector.kt:36)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageManagerImpl$PsiManagerRegisteredInjectorsAdapter.getLanguagesToInject(InjectedLanguageManagerImpl.java:484)
at com.intellij.psi.impl.source.tree.injected.InjectedPsiCachedValueProvider$MyInjProcessor.process(InjectedPsiCachedValueProvider.java:82)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageManagerImpl.processInPlaceInjectorsFor(InjectedLanguageManagerImpl.java:443)
at com.intellij.psi.impl.source.tree.injected.InjectedPsiCachedValueProvider.doCompute(InjectedPsiCachedValueProvider.java:62)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.a(InjectedLanguageUtil.java:315)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.enumerate(InjectedLanguageUtil.java:144)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.a(InjectedLanguageUtil.java:413)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.a(InjectedLanguageUtil.java:399)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.findInjectedElementNoCommit(InjectedLanguageUtil.java:371)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.findInjectedPsiNoCommit(InjectedLanguageUtil.java:271)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.getEditorForInjectedLanguageNoCommit(InjectedLanguageUtil.java:233)
at com.intellij.codeInsight.navigation.CtrlMouseHandler$5.mouseMoved(CtrlMouseHandler.java:212)
at sun.reflect.GeneratedMethodAccessor36.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.util.EventDispatcher.dispatch(EventDispatcher.java:88)
at com.intellij.util.EventDispatcher.access$100(EventDispatcher.java:34)
at com.intellij.util.EventDispatcher$1.invoke(EventDispatcher.java:68)
at com.sun.proxy.$Proxy25.mouseMoved(Unknown Source)
at com.intellij.openapi.editor.impl.EditorImpl$MyMouseMotionListener.mouseMoved(EditorImpl.java:6058)
at java.awt.Component.processMouseMotionEvent(Component.java:6588)
at javax.swing.JComponent.processMouseMotionEvent(JComponent.java:3342)
at java.awt.Component.processEvent(Component.java:6312)
at java.awt.Container.processEvent(Container.java:2235)
at java.awt.Component.dispatchEventImpl(Component.java:4899)
at java.awt.Container.dispatchEventImpl(Container.java:2293)
at java.awt.Component.dispatchEvent(Component.java:4721)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4897)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4545)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4461)
at java.awt.Container.dispatchEventImpl(Container.java:2279)
at java.awt.Window.dispatchEventImpl(Window.java:2750)
at java.awt.Component.dispatchEvent(Component.java:4721)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:751)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:702)
at java.awt.EventQueue$3.run(EventQueue.java:696)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:724)
at java.awt.EventQueue$4.run(EventQueue.java:722)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:721)
at com.intellij.ide.IdeEventQueue.e(IdeEventQueue.java:734)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:565)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:382)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

java.lang.NoClassDefFoundError: com/intellij/psi/impl/source/tree/injected/StringLiteralEscaper
at org.intellij.plugins.hcl.psi.impl.HCLStringLiteralMixin.createLiteralTextEscaper(HCLStringLiteralMixin.kt:35)
at com.intellij.psi.impl.source.tree.injected.MultiHostRegistrarImpl.addPlace(MultiHostRegistrarImpl.java:169)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageManagerImpl$PsiManagerRegisteredInjectorsAdapter$1.addPlace(InjectedLanguageManagerImpl.java:477)
at org.intellij.plugins.hcl.terraform.il.ILLanguageInjector.getStringLiteralInjections(Injector.kt:48)
at org.intellij.plugins.hcl.terraform.il.ILLanguageInjector.getLanguagesToInject(Injector.kt:36)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageManagerImpl$PsiManagerRegisteredInjectorsAdapter.getLanguagesToInject(InjectedLanguageManagerImpl.java:484)
at com.intellij.psi.impl.source.tree.injected.InjectedPsiCachedValueProvider$MyInjProcessor.process(InjectedPsiCachedValueProvider.java:82)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageManagerImpl.processInPlaceInjectorsFor(InjectedLanguageManagerImpl.java:443)
at com.intellij.psi.impl.source.tree.injected.InjectedPsiCachedValueProvider.doCompute(InjectedPsiCachedValueProvider.java:62)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.a(InjectedLanguageUtil.java:315)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.enumerate(InjectedLanguageUtil.java:144)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.a(InjectedLanguageUtil.java:413)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.a(InjectedLanguageUtil.java:399)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.findInjectedElementNoCommit(InjectedLanguageUtil.java:371)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.findInjectedPsiNoCommit(InjectedLanguageUtil.java:271)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.getEditorForInjectedLanguageNoCommit(InjectedLanguageUtil.java:233)
at com.intellij.codeInsight.navigation.CtrlMouseHandler$5.mouseMoved(CtrlMouseHandler.java:212)
at sun.reflect.GeneratedMethodAccessor36.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.util.EventDispatcher.dispatch(EventDispatcher.java:88)
at com.intellij.util.EventDispatcher.access$100(EventDispatcher.java:34)
at com.intellij.util.EventDispatcher$1.invoke(EventDispatcher.java:68)
at com.sun.proxy.$Proxy25.mouseMoved(Unknown Source)
at com.intellij.openapi.editor.impl.EditorImpl$MyMouseMotionListener.mouseMoved(EditorImpl.java:6058)
at java.awt.Component.processMouseMotionEvent(Component.java:6588)
at javax.swing.JComponent.processMouseMotionEvent(JComponent.java:3342)
at java.awt.Component.processEvent(Component.java:6312)
at java.awt.Container.processEvent(Container.java:2235)
at java.awt.Component.dispatchEventImpl(Component.java:4899)
at java.awt.Container.dispatchEventImpl(Container.java:2293)
at java.awt.Component.dispatchEvent(Component.java:4721)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4897)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4545)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4461)
at java.awt.Container.dispatchEventImpl(Container.java:2279)
at java.awt.Window.dispatchEventImpl(Window.java:2750)
at java.awt.Component.dispatchEvent(Component.java:4721)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:751)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:702)
at java.awt.EventQueue$3.run(EventQueue.java:696)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:724)
at java.awt.EventQueue$4.run(EventQueue.java:722)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:721)
at com.intellij.ide.IdeEventQueue.e(IdeEventQueue.java:734)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:565)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:382)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

java.lang.NoClassDefFoundError: com/intellij/psi/impl/source/tree/injected/StringLiteralEscaper
at org.intellij.plugins.hcl.psi.impl.HCLStringLiteralMixin.createLiteralTextEscaper(HCLStringLiteralMixin.kt:35)
at com.intellij.psi.impl.source.tree.injected.MultiHostRegistrarImpl.addPlace(MultiHostRegistrarImpl.java:169)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageManagerImpl$PsiManagerRegisteredInjectorsAdapter$1.addPlace(InjectedLanguageManagerImpl.java:477)
at org.intellij.plugins.hcl.terraform.il.ILLanguageInjector.getStringLiteralInjections(Injector.kt:48)
at org.intellij.plugins.hcl.terraform.il.ILLanguageInjector.getLanguagesToInject(Injector.kt:36)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageManagerImpl$PsiManagerRegisteredInjectorsAdapter.getLanguagesToInject(InjectedLanguageManagerImpl.java:484)
at com.intellij.psi.impl.source.tree.injected.InjectedPsiCachedValueProvider$MyInjProcessor.process(InjectedPsiCachedValueProvider.java:82)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageManagerImpl.processInPlaceInjectorsFor(InjectedLanguageManagerImpl.java:443)
at com.intellij.psi.impl.source.tree.injected.InjectedPsiCachedValueProvider.doCompute(InjectedPsiCachedValueProvider.java:62)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.a(InjectedLanguageUtil.java:315)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil.enumerate(InjectedLanguageUtil.java:144)
at com.intellij.codeInsight.daemon.impl.LineMarkersPass$2.process(LineMarkersPass.java:203)
at com.intellij.codeInsight.daemon.impl.LineMarkersPass$2.process(LineMarkersPass.java:200)
at com.intellij.psi.impl.source.tree.injected.InjectedLanguageManagerImpl.processInjectableElements(InjectedLanguageManagerImpl.java:232)
at com.intellij.codeInsight.daemon.impl.LineMarkersPass.collectLineMarkersForInjected(LineMarkersPass.java:200)
at com.intellij.codeInsight.daemon.impl.LineMarkersPass.doCollectInformation(LineMarkersPass.java:106)
at com.intellij.codeHighlighting.TextEditorHighlightingPass.collectInformation(TextEditorHighlightingPass.java:67)
at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass$1$1.run(PassExecutorService.java:444)
at com.intellij.openapi.application.impl.ApplicationImpl.tryRunReadAction(ApplicationImpl.java:1098)
at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass$1.run(PassExecutorService.java:435)
at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:452)
at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:402)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:54)
at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.a(PassExecutorService.java:432)
at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.run(PassExecutorService.java:408)
at com.intellij.concurrency.JobLauncherImpl$VoidForkJoinTask.exec(JobLauncherImpl.java:189)
at jsr166e.ForkJoinTask.doExec(ForkJoinTask.java:260)
at jsr166e.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:858)
at jsr166e.ForkJoinPool.scan(ForkJoinPool.java:1687)
at jsr166e.ForkJoinPool.runWorker(ForkJoinPool.java:1642)
at jsr166e.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:109)

Support refactoring "Extract variable"

In Intellij, for languages like Java, you have refactoring support. This might become very handy in the HCL plugin too to support Terraform refactorings.

The first refactoring I would like to see supported is to replace a constant value with a variable, given the constant value as a default value.

On top of that, the existence of a file variables.tf seems to be best practice although it is not necessarily needed. But if we follow best practices, the refactoring "Extract variable" should put the variable in the variables.tf file and create this file when it doesn't exist yet.

Support autocompletion in Terraform's 'depends_on' parameter

In Terraform resources can be linked with depends_on keyword:

resource "influxdb_database" "buildserver" {
  name = "buildserver"
}

resource "grafana_data_source" "buildserver" {
  depends_on = ["influxdb_database.buildserver"]
}

Values inside the array need autocompletion, even if not marked with HIL syntax like ${...}.

Double quote error for file function in interpolation

When I use the built-in file function in interpolation syntax as following

container_definitions = "${file("ecs-container-definitions.json")}"

Terraform commands could accept it without problem. But IntelliJ reports as syntax error. This syntax does look weird, but the official docs also use in this way.

Double backslash escape not correctly handled

The following valid HCL code is marked in error

resource "template_file" "test" {
  template = "${file("test.tpl")}"
  vars {
    devs = "${join("\\",\\"", values(var.developers))}"
  }
}

The 1st double backslash seems properly understood but the second occurrence is highlighted as error

Support multiline interpolations in heredocs

E.g.

variable "list" {
  type = "list"
  default = [1,2,3]
}
output "heredoc_multiline_inerpolation" {
  value = <<EOL
${join(
",",
var.list
)}
EOL
}

terraform apply output:
heredoc_multiline_inerpolation = 1,2,3,4,5,6,7,8,9,0

Support Terraform 0.7.0

  • New HCL/HIL syntax
    • HIL Escaping
    • Lists (#31)
    • Maps
    • Multiline string literals (#33)
  • Model schema
  • data blocks (#36)
  • Interpolations: Map/List indexing completion and references

Run configurations for `plan` and `apply` commands

  • Run configuration for project (terraform plan|apply .)
  • Run configuration for one specific resource (terraform plan|apply -target=FQN)
    • Show in gutter next to resource definition
  • Support next CLI options:
    • state
    • refresh
    • target
    • state-out (apply only)
    • out (plan only)
    • var-file
    • var
    • input - ask for input somehow (show dialogs?)

Escaped Quotes break highlight/inspection

Looks like if I have something like this, it will mark it as an error:

provisioner "remote-exec" {
    inline = ["echo \"export CONF=${var.value}\" >> /home/ubuntu/.bashrc"]
  }

The backslashes cause the error

AE on editing injected fragment

Assertion failed
java.lang.AssertionError: Assertion failed
    at org.intellij.plugins.hcl.psi.impl.HCLStringLiteralMixin.updateText(HCLStringLiteralMixin.kt:88)
    at org.intellij.plugins.hcl.psi.HCLStringLiteralManipulator.handleContentChange(HCLStringLiteralManipulator.kt:27)
    at org.intellij.plugins.hcl.psi.HCLStringLiteralManipulator.handleContentChange(HCLStringLiteralManipulator.kt:23)
    at com.intellij.codeInsight.intention.impl.QuickEditHandler.b(QuickEditHandler.java:420)
    at com.intellij.codeInsight.intention.impl.QuickEditHandler.access$1000(QuickEditHandler.java:83)
    at com.intellij.codeInsight.intention.impl.QuickEditHandler$8.run(QuickEditHandler.java:375)
    at com.intellij.psi.impl.source.PostprocessReformattingAspect$3.compute(PostprocessReformattingAspect.java:115)
    at com.intellij.psi.impl.source.PostprocessReformattingAspect.disablePostprocessFormattingInside(PostprocessReformattingAspect.java:124)
    at com.intellij.psi.impl.source.PostprocessReformattingAspect.disablePostprocessFormattingInside(PostprocessReformattingAspect.java:112)
    at com.intellij.codeInsight.intention.impl.QuickEditHandler.a(QuickEditHandler.java:368)
    at com.intellij.codeInsight.intention.impl.QuickEditHandler.documentChanged(QuickEditHandler.java:276)
    at com.intellij.openapi.editor.impl.DocumentImpl.a(DocumentImpl.java:774)
    at com.intellij.openapi.editor.impl.DocumentImpl.a(DocumentImpl.java:713)
    at com.intellij.openapi.editor.impl.DocumentImpl.insertString(DocumentImpl.java:468)
    at com.intellij.openapi.editor.EditorModificationUtil.insertStringAtCaretNoScrolling(EditorModificationUtil.java:131)
    at com.intellij.openapi.editor.EditorModificationUtil.insertStringAtCaret(EditorModificationUtil.java:96)
    at com.intellij.openapi.editor.EditorModificationUtil.insertStringAtCaret(EditorModificationUtil.java:88)
    at com.intellij.openapi.editor.EditorModificationUtil.typeInStringAtCaretHonorBlockSelection(EditorModificationUtil.java:325)
    at com.intellij.codeInsight.editorActions.TypedHandler.a(TypedHandler.java:240)
    at com.intellij.codeInsight.editorActions.TypedHandler.access$100(TypedHandler.java:63)
    at com.intellij.codeInsight.editorActions.TypedHandler$1.perform(TypedHandler.java:204)
    at com.intellij.openapi.editor.impl.CaretModelImpl$3.run(CaretModelImpl.java:345)
    at com.intellij.openapi.editor.impl.CaretModelImpl.doWithCaretMerging(CaretModelImpl.java:425)
    at com.intellij.openapi.editor.impl.CaretModelImpl.runForEachCaret(CaretModelImpl.java:336)
    at com.intellij.openapi.editor.impl.CaretModelImpl.runForEachCaret(CaretModelImpl.java:327)
    at com.intellij.codeInsight.editorActions.TypedHandler.execute(TypedHandler.java:148)
    at com.intellij.codeInsight.lookup.impl.LookupTypedHandler.execute(LookupTypedHandler.java:90)
    at com.intellij.codeInsight.editorActions.AutoFormatTypedHandler.b(AutoFormatTypedHandler.java:167)
    at com.intellij.codeInsight.editorActions.AutoFormatTypedHandler.execute(AutoFormatTypedHandler.java:94)
    at com.goide.editor.GoTypedHandler.execute(GoTypedHandler.java:39)
    at com.intellij.openapi.editor.actionSystem.TypedAction$DefaultRawHandler$1$1.run(TypedAction.java:153)
    at com.intellij.openapi.application.impl.ApplicationImpl.runWriteAction(ApplicationImpl.java:1009)
    at com.intellij.openapi.editor.actionSystem.TypedAction$DefaultRawHandler$1.run(TypedAction.java:147)
    at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:124)
    at com.intellij.openapi.editor.actionSystem.TypedAction$DefaultRawHandler.execute(TypedAction.java:139)
    at com.intellij.openapi.editor.actionSystem.TypedAction.actionPerformed(TypedAction.java:133)
    at com.intellij.openapi.editor.impl.EditorImpl.b(EditorImpl.java:1165)
    at com.intellij.openapi.editor.impl.EditorImpl.processKeyTyped(EditorImpl.java:5481)
    at com.intellij.openapi.editor.impl.EditorImpl$9.keyTyped(EditorImpl.java:996)
    at java.awt.Component.processKeyEvent(Component.java:6490)
    at javax.swing.JComponent.processKeyEvent(JComponent.java:2832)
    at java.awt.Component.processEvent(Component.java:6312)
    at java.awt.Container.processEvent(Container.java:2236)
    at java.awt.Component.dispatchEventImpl(Component.java:4891)
    at java.awt.Container.dispatchEventImpl(Container.java:2294)
    at java.awt.Component.dispatchEvent(Component.java:4713)
    at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1954)
    at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:806)
    at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:1074)
    at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:945)
    at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:771)
    at java.awt.Component.dispatchEventImpl(Component.java:4762)
    at java.awt.Container.dispatchEventImpl(Container.java:2294)
    at java.awt.Window.dispatchEventImpl(Window.java:2750)
    at java.awt.Component.dispatchEvent(Component.java:4713)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.awt.EventQueue$4.run(EventQueue.java:731)
    at java.awt.EventQueue$4.run(EventQueue.java:729)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
    at com.intellij.ide.IdeEventQueue.c(IdeEventQueue.java:857)
    at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:632)
    at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:386)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)


Affected version: 0.5.0

Syntax update for templates in Terraform 0.6.7

When using the plug in with rubymine I get an warning about not having the "filename". They just made this change so just wanted you to know about it.

Template Providers

filename - _Deprecated, please use template instead. The filename for the template. Use path variables to make this path relative to different path roots.

resource "template_file" "init" {
    filename = "${file("${path.module}/init.tpl")}"

    vars {
        consul_address = "${aws_instance.consul.private_ip}"
    }
}

vs

resource "template_file" "init" {
    template = "${file("${path.module}/init.tpl")}"

    vars {
        consul_address = "${aws_instance.consul.private_ip}"
    }
}

Exception in latest PyCharm

I've been using this excellent plugin in PyCharm. Since the 4.5.4 update I've started seeing the following error:

NoClassDefFoundError: com/intellij/psi/impl/source/tree/injected/StringLiteralEscaper

Any thoughts?

FileAlreadyExistsException

I frequently get FileAlreadyExistsException fatal error. My ~/Library/Preferences/IntelliJIdea2016.2/ directory is symlinked, so that could be causing the problem. Everything else works fine with the symlinked directory...

java.nio.file.FileAlreadyExistsException: ~/Library/Preferences/IntelliJIdea2016.2
    at sun.nio.fs.UnixException.translateToIOException(UnixException.java:88)
    at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
    at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
    at sun.nio.fs.UnixFileSystemProvider.createDirectory(UnixFileSystemProvider.java:384)
    at java.nio.file.Files.createDirectory(Files.java:674)
    at java.nio.file.Files.createAndCheckIsDirectory(Files.java:781)
    at java.nio.file.Files.createDirectories(Files.java:727)
    at com.intellij.util.PathKt.createDirectories(path.kt:30)
    at com.intellij.util.PathKt.write(path.kt:98)
    at org.jetbrains.builtInWebServer.BuiltInWebServerKt$STANDARD_COOKIE$2.invoke(BuiltInWebServer.kt:129)
    at org.jetbrains.builtInWebServer.BuiltInWebServerKt$STANDARD_COOKIE$2.invoke(BuiltInWebServer.kt)
    at kotlin.SynchronizedLazyImpl.getValue(Lazy.kt:131)
    at org.jetbrains.builtInWebServer.BuiltInWebServerKt.a(BuiltInWebServer.kt)
    at org.jetbrains.builtInWebServer.BuiltInWebServerKt.validateToken(BuiltInWebServer.kt:282)
    at org.jetbrains.builtInWebServer.DefaultWebServerPathHandler.process(DefaultWebServerPathHandler.kt:52)
    at org.jetbrains.builtInWebServer.BuiltInWebServerKt.a(BuiltInWebServer.kt:242)
    at org.jetbrains.builtInWebServer.BuiltInWebServerKt.access$doProcess(BuiltInWebServer.kt:1)
    at org.jetbrains.builtInWebServer.BuiltInWebServer.process(BuiltInWebServer.kt:105)
    at org.jetbrains.io.DelegatingHttpRequestHandler$process$1.invoke(DelegatingHttpRequestHandler.kt:41)
    at org.jetbrains.io.DelegatingHttpRequestHandler.process(DelegatingHttpRequestHandler.kt:56)
    at org.jetbrains.io.DelegatingHttpRequestHandlerBase.messageReceived(DelegatingHttpRequestHandlerBase.kt:29)
    at org.jetbrains.io.DelegatingHttpRequestHandlerBase.messageReceived(DelegatingHttpRequestHandlerBase.kt:25)
    at org.jetbrains.io.SimpleChannelInboundHandlerAdapter.channelRead0(SimpleChannelInboundHandlerAdapter.java:20)
    at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:334)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:326)
    at io.netty.handler.codec.http.cors.CorsHandler.channelRead(CorsHandler.java:70)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:334)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:326)
    at io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:86)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:334)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:326)
    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:334)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:326)
    at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:293)
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:267)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:334)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:326)
    at org.jetbrains.io.PortUnificationServerHandler.decode(PortUnificationServerHandler.java:139)
    at org.jetbrains.io.PortUnificationServerHandler.messageReceived(PortUnificationServerHandler.java:86)
    at org.jetbrains.io.Decoder.channelRead(Decoder.java:38)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:334)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:326)
    at io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:86)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:334)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:326)
    at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1320)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:334)
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:905)
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:123)
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:563)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:504)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:418)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:390)
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:742)
    at java.lang.Thread.run(Thread.java:745)

Add inspection for unused resources

Hello,

It could be useful to see which resources are defined and not used, much like how other languages support this feature for variables (for example).

Thank you!

Support new data sources - 0.7.3

Hi,

Can you please add support for the new aws_cloudformation_stack data source;

data "aws_cloudformation_stack" "network" {
    name = "my-network-stack"
}

resource "aws_instance" "web" {
    ami = "ami-abb07bcb"
    instance_type = "t1.micro"
    subnet_id = "${data.aws_cloudformation_stack.network.outputs["SubnetId"]}"
    tags {
        Name = "HelloWorld"
    }
}

It has 9 attributes reference.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.