This is an automated email from the ASF dual-hosted git repository.
lkishalmi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git
The following commit(s) were added to refs/heads/master by this push:
new fb9e029bda Languages.hcl terraform semantic highlights (#6081)
fb9e029bda is described below
commit fb9e029bda8d4aa5e1e4c69b86304102a049f147
Author: Laszlo Kishalmi <[email protected]>
AuthorDate: Tue Jun 20 13:05:43 2023 -0700
Languages.hcl terraform semantic highlights (#6081)
* Initial Semantic Highlights for Terraform
* Add `check` block (new in Terraform 1.5)
* Added more highlighting options and code samples for the Options dialog
---
ide/languages.hcl/build.xml | 1 -
ide/languages.hcl/licenseinfo.xml | 5 +
.../modules/languages/hcl/BasicHCLLexer.java | 7 +-
.../modules/languages/hcl/Bundle.properties | 5 +
.../modules/languages/hcl/FontAndColors.xml | 9 ++
.../netbeans/modules/languages/hcl/HCLTokenId.java | 1 +
.../languages/hcl/grammar/g4/TerraformLexer.g4 | 93 --------------
.../org/netbeans/modules/languages/hcl/layer.xml | 30 +++++
.../languages/hcl/terraform/TerraformHCLLexer.java | 138 ---------------------
.../languages/hcl/terraform/TerraformLanguage.java | 9 +-
.../hcl/terraform/TerraformParserResult.java | 15 ++-
.../hcl/terraform/TerraformSemanticAnalyzer.java | 110 ++++++++++++++++
.../modules/languages/hcl/terraform/example.tf | 42 +++++++
.../modules/languages/hcl/tfvars/example.tfvars | 14 +++
14 files changed, 241 insertions(+), 238 deletions(-)
diff --git a/ide/languages.hcl/build.xml b/ide/languages.hcl/build.xml
index 6966927cb7..c31b46ddab 100644
--- a/ide/languages.hcl/build.xml
+++ b/ide/languages.hcl/build.xml
@@ -39,7 +39,6 @@
<arg value="-package"/>
<arg value="org.netbeans.modules.languages.hcl.grammar"/>
<arg value="HCLLexer.g4"/>
- <arg value="TerraformLexer.g4"/>
<arg value="HCLParser.g4"/>
</java>
diff --git a/ide/languages.hcl/licenseinfo.xml
b/ide/languages.hcl/licenseinfo.xml
index 80c4dbaeea..e13e2e886e 100644
--- a/ide/languages.hcl/licenseinfo.xml
+++ b/ide/languages.hcl/licenseinfo.xml
@@ -24,4 +24,9 @@
<file>src/org/netbeans/modules/languages/hcl/resources/terraform.png</file>
<license ref="MIT-vscode-material-icon-theme" />
</fileset>
+ <fileset>
+
<file>src/org/netbeans/modules/languages/hcl/terraform/example.tf</file>
+
<file>src/org/netbeans/modules/languages/hcl/tfvars/example.tfvars</file>
+ <license ref="Apache-2.0-ASF" />
+ </fileset>
</licenseinfo>
diff --git
a/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/BasicHCLLexer.java
b/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/BasicHCLLexer.java
index 141cdaa899..e763877374 100644
---
a/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/BasicHCLLexer.java
+++
b/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/BasicHCLLexer.java
@@ -44,6 +44,7 @@ public final class BasicHCLLexer extends AbstractHCLLexer {
case BOOL_LIT:
return token(BOOLEAN);
+ case LEGACY_INDEX:
case NUMERIC_LIT:
return token(NUMBER);
@@ -60,10 +61,14 @@ public final class BasicHCLLexer extends AbstractHCLLexer {
case RBRACE:
case LBRACK:
case RBRACK:
+ return token(GROUP_SEPARATOR);
+
case LPAREN:
case RPAREN:
+ case COLON:
case COMMA:
case DOT:
+ case EQUAL:
case INTERPOLATION_START:
case INTERPOLATION_END:
case RARROW:
@@ -72,9 +77,7 @@ public final class BasicHCLLexer extends AbstractHCLLexer {
return token(SEPARATOR);
case AND:
- case COLON:
case ELLIPSIS:
- case EQUAL:
case EQUALS:
case GT:
case GTE:
diff --git
a/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/Bundle.properties
b/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/Bundle.properties
index e9a35a6348..2e76a88c13 100644
--- a/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/Bundle.properties
+++ b/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/Bundle.properties
@@ -23,6 +23,7 @@ OpenIDE-Module-Long-Description=Support for editing Terraform
files.
boolean=Boolean
comment=Comment
error=Error
+group-separator=Group Separator
heredoc-guard=HereDoc Guard
heredoc=HereDoc
interpolation=Interpolation
@@ -33,3 +34,7 @@ operator=Operator
separator=Separator
string=String
whitespace=Whitespace
+
+mod-class=Declaration Type
+mod-constructor=Declaration Identifier
+mod-field=Attribute
\ No newline at end of file
diff --git
a/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/FontAndColors.xml
b/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/FontAndColors.xml
index e73a8b1466..e341ee2755 100644
--- a/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/FontAndColors.xml
+++ b/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/FontAndColors.xml
@@ -24,6 +24,7 @@
<fontcolor name="boolean" default="keyword"/>
<fontcolor name="comment" default="comment"/>
<fontcolor name="error" default="error"/>
+ <fontcolor name="group-separator" default="separator"/>
<fontcolor name="heredoc" foreColor="ffce7b00"/>
<fontcolor name="heredoc-guard" foreColor="ffce7b00">
<font style="bold"/>
@@ -36,4 +37,12 @@
<fontcolor name="separator" default="separator"/>
<fontcolor name="string" default="string"/>
<fontcolor name="whitespace" default="whitespace"/>
+
+ <fontcolor name="mod-class" default="keyword">
+ </fontcolor>
+ <fontcolor name="mod-constructor" default="default">
+ <font style="bold"/>
+ </fontcolor>
+ <fontcolor name="mod-field" default="field">
+ </fontcolor>
</fontscolors>
diff --git
a/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/HCLTokenId.java
b/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/HCLTokenId.java
index 30e37f6b3d..9a7602b7c5 100644
--- a/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/HCLTokenId.java
+++ b/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/HCLTokenId.java
@@ -29,6 +29,7 @@ public enum HCLTokenId implements TokenId {
BOOLEAN("boolean"),
COMMENT("comment"),
ERROR("error"),
+ GROUP_SEPARATOR("group-separator"),
HEREDOC_GUARD("heredoc-guard"),
HEREDOC("heredoc"),
IDENTIFIER("identifier"),
diff --git
a/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/grammar/g4/TerraformLexer.g4
b/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/grammar/g4/TerraformLexer.g4
deleted file mode 100644
index 1e26ad03df..0000000000
---
a/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/grammar/g4/TerraformLexer.g4
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-lexer grammar TerraformLexer;
-options { superClass = org.netbeans.modules.languages.hcl.HCLHereDocAdaptor; }
-import HCLLexer;
-
-BOOL
- : 'bool'
- ;
-
-DATA
- : 'data'
- ;
-
-LIST
- : 'list'
- ;
-
-LOCALS
- : 'locals'
- ;
-
-LOCAL
- : 'local'
- ;
-
-MAP
- : 'map'
- ;
-
-MODULE
- : 'module'
- ;
-
-MOVED
- : 'moved'
- ;
-
-NUMBER
- : 'number'
- ;
-
-OBJECT
- : 'object'
- ;
-
-OPTIONAL
- : 'optional'
- ;
-
-OUTPUT
- : 'output'
- ;
-
-PROVIDER
- : 'provider'
- ;
-
-RESOURCE
- : 'resource'
- ;
-
-STRING
- : 'string'
- ;
-
-TERRAFORM
- : 'terraform'
- ;
-
-VARIABLE
- : 'variable'
- ;
-
-VAR
- : 'var'
- ;
diff --git a/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/layer.xml
b/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/layer.xml
index 13c2cade59..468d318ef6 100644
--- a/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/layer.xml
+++ b/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/layer.xml
@@ -62,6 +62,36 @@
</folder>
</folder>
</folder>
+ <folder name="OptionsDialog">
+ <folder name="PreviewExamples">
+ <folder name="text">
+ <file name="x-terraform+x-hcl" url="terraform/example.tf"/>
+ <file name="x-tfvars+x-hcl" url="tfvars/example.tfvars"/>
+ </folder>
+ </folder>
+ <folder name="Editor">
+ <folder name="Formatting">
+ <folder name="text">
+ <folder name="x-terraform+x-hcl">
+ <file name="TabsAndIndents.instance">
+ <attr name="instanceOf"
stringvalue="org.netbeans.modules.options.editor.spi.PreferencesCustomizer$Factory"/>
+ <attr name="instanceCreate"
methodvalue="org.netbeans.modules.options.editor.spi.CustomizerFactories.createDefaultTabsAndIndentsCustomizerFactory"/>
+ <attr name="previewTextFile"
stringvalue="org/netbeans/modules/languages/hcl/terraform/example.yaml"/>
+ <attr name="position" intvalue="100"/>
+ </file>
+ </folder>
+ <folder name="x-tfvars+x-hcl">
+ <file name="TabsAndIndents.instance">
+ <attr name="instanceOf"
stringvalue="org.netbeans.modules.options.editor.spi.PreferencesCustomizer$Factory"/>
+ <attr name="instanceCreate"
methodvalue="org.netbeans.modules.options.editor.spi.CustomizerFactories.createDefaultTabsAndIndentsCustomizerFactory"/>
+ <attr name="previewTextFile"
stringvalue="org/netbeans/modules/languages/hcl/tfvars/example.yaml"/>
+ <attr name="position" intvalue="100"/>
+ </file>
+ </folder>
+ </folder>
+ </folder>
+ </folder>
+ </folder>
<folder name="Loaders">
<folder name="text">
<folder name="x-terraform+x-hcl">
diff --git
a/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/terraform/TerraformHCLLexer.java
b/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/terraform/TerraformHCLLexer.java
deleted file mode 100644
index ecc40d974c..0000000000
---
a/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/terraform/TerraformHCLLexer.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.netbeans.modules.languages.hcl.terraform;
-
-import org.netbeans.api.lexer.Token;
-import org.netbeans.modules.languages.hcl.AbstractHCLLexer;
-import org.netbeans.modules.languages.hcl.HCLTokenId;
-import static org.netbeans.modules.languages.hcl.HCLTokenId.*;
-import org.netbeans.modules.languages.hcl.grammar.TerraformLexer;
-import static org.netbeans.modules.languages.hcl.grammar.TerraformLexer.*;
-import org.netbeans.spi.lexer.LexerRestartInfo;
-
-/**
- *
- * @author Laszlo Kishalmi
- */
-public final class TerraformHCLLexer extends AbstractHCLLexer {
-
- public TerraformHCLLexer(LexerRestartInfo<HCLTokenId> info) {
- super(info, TerraformLexer::new);
- }
-
- @Override
- protected Token<HCLTokenId> mapToken(org.antlr.v4.runtime.Token
antlrToken) {
- switch (antlrToken.getType()) {
- case LINE_COMMENT:
- case BLOCK_COMMENT:
- return token(COMMENT);
-
- case BOOL_LIT:
- return token(BOOLEAN);
-
- case NUMERIC_LIT:
- return token(HCLTokenId.NUMBER);
-
- case TerraformLexer.IDENTIFIER:
- return token(HCLTokenId.IDENTIFIER);
-
- case BOOL:
- case DATA:
- case LIST:
- case LOCALS:
- case LOCAL:
- case MAP:
- case MODULE:
- case MOVED:
- case TerraformLexer.NUMBER:
- case OBJECT:
- case OPTIONAL:
- case OUTPUT:
- case PROVIDER:
- case RESOURCE:
- case TerraformLexer.STRING:
- case TERRAFORM:
- case VAR:
- case VARIABLE:
- case FOR:
- case IF:
- case IN:
- case NULL:
- return token(KEYWORD);
-
- case LBRACE:
- case RBRACE:
- case LBRACK:
- case RBRACK:
- case LPAREN:
- case RPAREN:
- case COMMA:
- case DOT:
- case INTERPOLATION_START:
- case INTERPOLATION_END:
- case RARROW:
- case TEMPLATE_START:
- case TEMPLATE_END:
- return token(SEPARATOR);
-
- case AND:
- case COLON:
- case ELLIPSIS:
- case EQUAL:
- case EQUALS:
- case GT:
- case GTE:
- case LT:
- case LTE:
- case MINUS:
- case NOT:
- case NOT_EQUALS:
- case OR:
- case PERCENT:
- case PLUS:
- case QUESTION:
- case SLASH:
- case STAR:
- return token(OPERATOR);
-
- case QUOTE:
- return token(HCLTokenId.STRING);
- case HEREDOC_START:
- case HEREDOC_END:
- return token(HEREDOC_GUARD);
- case HEREDOC_CONTENT:
- return groupToken(HEREDOC, HEREDOC_CONTENT);
-
- case STRING_CONTENT:
- return groupToken(HCLTokenId.STRING, STRING_CONTENT);
-
- case INTERPOLATION_CONTENT:
- return groupToken(INTERPOLATION, INTERPOLATION_CONTENT);
-
- case TEMPLATE_CONTENT:
- return groupToken(INTERPOLATION, TEMPLATE_CONTENT);
- case WS:
- case NL:
- return token(WHITESPACE);
-
- default:
- return token(ERROR);
- }
- }
-}
diff --git
a/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/terraform/TerraformLanguage.java
b/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/terraform/TerraformLanguage.java
index 42e8bece3f..cddd34088f 100644
---
a/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/terraform/TerraformLanguage.java
+++
b/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/terraform/TerraformLanguage.java
@@ -24,8 +24,10 @@ import org.netbeans.api.lexer.InputAttributes;
import org.netbeans.api.lexer.Language;
import org.netbeans.api.lexer.LanguagePath;
import org.netbeans.api.lexer.Token;
+import org.netbeans.modules.csl.api.SemanticAnalyzer;
import org.netbeans.modules.csl.api.StructureScanner;
import org.netbeans.modules.csl.spi.LanguageRegistration;
+import org.netbeans.modules.languages.hcl.BasicHCLLexer;
import org.netbeans.modules.languages.hcl.HCLLanguage;
import org.netbeans.modules.languages.hcl.HCLTokenId;
import org.netbeans.modules.languages.hcl.NbHCLParser;
@@ -75,6 +77,11 @@ public final class TerraformLanguage extends HCLLanguage {
return new
NbHCLParser<TerraformParserResult>(TerraformParserResult::new);
}
+ @Override
+ public SemanticAnalyzer getSemanticAnalyzer() {
+ return new TerraformSemanticAnalyzer();
+ }
+
@Override
public StructureScanner getStructureScanner() {
return super.getStructureScanner();
@@ -94,7 +101,7 @@ public final class TerraformLanguage extends HCLLanguage {
@Override
protected Lexer<HCLTokenId> createLexer(LexerRestartInfo<HCLTokenId>
info) {
- return new TerraformHCLLexer(info);
+ return new BasicHCLLexer(info);
}
@Override
diff --git
a/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/terraform/TerraformParserResult.java
b/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/terraform/TerraformParserResult.java
index 4c88102076..facf8b5267 100644
---
a/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/terraform/TerraformParserResult.java
+++
b/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/terraform/TerraformParserResult.java
@@ -43,11 +43,13 @@ import org.openide.util.NbBundle.Messages;
public class TerraformParserResult extends HCLParserResult {
- enum BlockType {
+ public enum BlockType {
+ CHECK("check", 2),
DATA("data", 3),
LOCALS("locals", 1),
MODULE("module", 2),
+ MOVED("moved", 1),
OUTPUT("output", 2),
PROVIDER("provider", 2),
RESOURCE("resource", 3),
@@ -89,7 +91,10 @@ public class TerraformParserResult extends HCLParserResult {
"# {0} - Block ID",
"DUPLICATE_BLOCK=Duplicate Block Definition: {0}",
"# {0} - Attribute name",
- "DUPLICATE_ATTRIBUTE=Attribute {0} has already defined"
+ "DUPLICATE_ATTRIBUTE=Attribute {0} has already defined",
+ "# {0} - Attribute name",
+ "UNEXPECTED_DOCUMENT_ATTRIBUTE=No attributes expected at Terraform
document level.",
+
})
protected void processDocument(HCLDocument doc, SourceRef references) {
Set<String> defined = new HashSet<>();
@@ -104,6 +109,7 @@ public class TerraformParserResult extends HCLParserResult {
} else {
if (!defined.add(block.id())) {
switch (bt) {
+ case CHECK:
case DATA:
case MODULE:
case OUTPUT:
@@ -116,8 +122,11 @@ public class TerraformParserResult extends HCLParserResult
{
} else {
references.getOffsetRange(type).ifPresent((range) ->
addError(Bundle.UNKNOWN_BLOCK(type.id()), range));
}
+ checkDuplicateAttribute(block, references);
+ }
+ for (HCLAttribute attribute : doc.getAttributes()) {
+ references.getOffsetRange(attribute.getName()).ifPresent((range)
-> addError(Bundle.UNEXPECTED_DOCUMENT_ATTRIBUTE(attribute.id()), range));
}
- checkDuplicateAttribute(doc, references);
}
private void checkDuplicateAttribute(HCLContainer c, SourceRef references)
{
diff --git
a/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/terraform/TerraformSemanticAnalyzer.java
b/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/terraform/TerraformSemanticAnalyzer.java
new file mode 100644
index 0000000000..7d992dff29
--- /dev/null
+++
b/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/terraform/TerraformSemanticAnalyzer.java
@@ -0,0 +1,110 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.languages.hcl.terraform;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.netbeans.modules.csl.api.ColoringAttributes;
+import org.netbeans.modules.csl.api.OffsetRange;
+import org.netbeans.modules.csl.api.SemanticAnalyzer;
+import org.netbeans.modules.languages.hcl.ast.HCLAttribute;
+import org.netbeans.modules.languages.hcl.ast.HCLBlock;
+import org.netbeans.modules.languages.hcl.ast.HCLIdentifier;
+import org.netbeans.modules.languages.hcl.ast.SourceRef;
+import org.netbeans.modules.parsing.spi.Scheduler;
+import org.netbeans.modules.parsing.spi.SchedulerEvent;
+
+/**
+ *
+ * @author lkishalmi
+ */
+public final class TerraformSemanticAnalyzer extends
SemanticAnalyzer<TerraformParserResult> {
+
+ private volatile boolean cancelled;
+ private Map<OffsetRange, Set<ColoringAttributes>> semanticHighlights;
+
+ @Override
+ public Map<OffsetRange, Set<ColoringAttributes>> getHighlights() {
+ return semanticHighlights;
+ }
+
+ protected final synchronized boolean isCancelled() {
+ return cancelled;
+ }
+
+ protected final synchronized void resume() {
+ cancelled = false;
+ }
+
+ @Override
+ public void run(TerraformParserResult result, SchedulerEvent event) {
+ resume();
+
+ if (isCancelled()) {
+ return;
+ }
+ Map<OffsetRange, Set<ColoringAttributes>> highlights = new HashMap<>();
+ SourceRef refs = result.getReferences();
+ for (HCLBlock block : result.getDocument().getBlocks()) {
+ List<HCLIdentifier> decl = block.getDeclaration();
+ HCLIdentifier type = decl.get(0);
+
+ TerraformParserResult.BlockType bt =
TerraformParserResult.BlockType.get(type.id());
+ if (bt != null) {
+ refs.getOffsetRange(type).ifPresent((range) ->
highlights.put(range, ColoringAttributes.CLASS_SET));
+ if (decl.size() > 1) {
+ for (int i = 1; i < decl.size(); i++) {
+ HCLIdentifier id = decl.get(i);
+ refs.getOffsetRange(id).ifPresent((range) ->
highlights.put(range, ColoringAttributes.CONSTRUCTOR_SET));
+ }
+ }
+ }
+ markAttributes(highlights, refs, block);
+ }
+ semanticHighlights = highlights;
+ }
+
+ private void markAttributes(Map<OffsetRange, Set<ColoringAttributes>>
highlights, SourceRef refs, HCLBlock block) {
+ for (HCLAttribute attr : block.getAttributes()) {
+ refs.getOffsetRange(attr.getName()).ifPresent((range) ->
highlights.put(range, ColoringAttributes.FIELD_SET));
+ }
+ for (HCLBlock nested : block.getBlocks()) {
+ markAttributes(highlights, refs, nested);
+ }
+ }
+
+ @Override
+ public int getPriority() {
+ return 0;
+ }
+
+ @Override
+ public Class<? extends Scheduler> getSchedulerClass() {
+ return Scheduler.EDITOR_SENSITIVE_TASK_SCHEDULER;
+ }
+
+ @Override
+ public void cancel() {
+ cancelled = true;
+ }
+
+
+}
diff --git
a/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/terraform/example.tf
b/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/terraform/example.tf
new file mode 100644
index 0000000000..740718c4fa
--- /dev/null
+++
b/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/terraform/example.tf
@@ -0,0 +1,42 @@
+/*
+This is a multi line commant
+*/
+locals {
+ azs = [ for i in ["a", "b", "c"] : "us-east-1${i}" ]
+ vpc_id = data.terraform_remote_state.vpc.outputs.vpc_id
+ multiline = <<-EOT
+ This is a
+ multiline text
+ EOT
+}
+
+variable "domain_name" {
+ type = string
+ default = "example.com"
+}
+
+
+data "http" "example" {
+ url = "https://${var.domain_name}/something"
+
+ # Optional request headers
+ request_headers = {
+ Accept = "application/json"
+ }
+}
+
+resource "tls_private_key" "example" {
+ algorithm = "RSA"
+ rsa_bits = 4096
+}
+
+resource "tls_cert_request" "example" {
+ private_key_pem = tls_private_key.example.private_key_pem
+
+ is_ca_certificate = false
+
+ subject {
+ common_name = var.domain_name
+ organization = "ACME Examples, Inc"
+ }
+}
\ No newline at end of file
diff --git
a/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/tfvars/example.tfvars
b/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/tfvars/example.tfvars
new file mode 100644
index 0000000000..a58ccabea4
--- /dev/null
+++
b/ide/languages.hcl/src/org/netbeans/modules/languages/hcl/tfvars/example.tfvars
@@ -0,0 +1,14 @@
+/*
+This is a multi line commant
+*/
+is_bool = true
+multiline = <<-EOT
+ This is a
+ multiline text
+EOT
+solution = 42 // This is a good number
+
+database = {
+ name = "example"
+ tables = ["orders", "curtomers"]
+}
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists