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

Reply via email to