Skip to content

Commit

Permalink
Made HCL HereDoc actually work.
Browse files Browse the repository at this point in the history
  • Loading branch information
lkishalmi committed Mar 9, 2023
1 parent 6c16bf4 commit 9db2623
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ OpenIDE-Module-Long-Description=Support for editing Terraform files.
boolean=Boolean
comment=Comment
error=Error
heredoc-guard=HereDoc Guard
heredoc=HereDoc
interpolation=Interpolation
identifier=Identifier
keyword=Keyword
number=Number
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,18 @@
-->
<!DOCTYPE fontscolors PUBLIC "-//NetBeans//DTD Editor Fonts and Colors settings 1.1//EN" "http://www.netbeans.org/dtds/EditorFontsColors-1_1.dtd">
<fontscolors>
<fontcolor name="boolean" default="keyword"/>
<fontcolor name="comment" default="comment"/>
<fontcolor name="error" default="error"/>
<fontcolor name="interpolation" bgColor="ffe3f2e1" default="default"/>
<fontcolor name="heredoc" foreColor="ffce7b00"/>
<fontcolor name="heredoc-guard" foreColor="ffce7b00">
<font style="bold"/>
</fontcolor>
<fontcolor name="interpolation" default="default"/>
<fontcolor name="keyword" default="keyword"/>
<fontcolor name="number" default="number"/>
<fontcolor name="operator" default="operator"/>
<fontcolor name="separator" default="separator"/>

<fontcolor name="string" default="string"/>
<fontcolor name="whitespace" default="whitespace"/>
</fontscolors>
Original file line number Diff line number Diff line change
Expand Up @@ -29,17 +29,16 @@ public enum HCLTokenId implements TokenId {
BOOLEAN("boolean"),
COMMENT("comment"),
ERROR("error"),
HEREDOC_GUARDS("heredoc-guards"),
HEREDOC("string"),
HEREDOC_GUARD("heredoc-guard"),
HEREDOC("heredoc"),
IDENTIFIER("identifier"),
INTERPOLATION("interpolation"),
KEYWORD("keyword"),
NUMBER("number"),
OPERATOR("operator"),
SEPARATOR("separator"),
STRING("string"),
VARIABLE("identifier"),
WHITESPACE("whitespace")
;
WHITESPACE("whitespace");

private final String category;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,18 @@
package org.netbeans.modules.languages.hcl;

import java.text.Normalizer;
import java.util.BitSet;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.antlr.v4.runtime.ANTLRErrorListener;
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.Parser;
import org.antlr.v4.runtime.RecognitionException;
import org.antlr.v4.runtime.Recognizer;
import org.antlr.v4.runtime.atn.ATNConfigSet;
import org.antlr.v4.runtime.dfa.DFA;
import org.antlr.v4.runtime.misc.ParseCancellationException;
import org.netbeans.api.lexer.Token;
import org.netbeans.modules.languages.hcl.grammar.HCLLexer;
import org.netbeans.spi.lexer.LexerRestartInfo;
Expand All @@ -35,8 +46,10 @@
*/
public final class NbHCLLexer extends AbstractAntlrLexerBridge<HCLLexer, HCLTokenId> {

private static final Logger LOG = Logger.getLogger(NbHCLLexer.class.getName());

public NbHCLLexer(LexerRestartInfo<HCLTokenId> info) {
super(info, HCLLexer::new);
super(info, NbHCLLexer::createLexer);
}

@Override
Expand All @@ -52,8 +65,8 @@ protected Token<HCLTokenId> mapToken(org.antlr.v4.runtime.Token antlrToken) {
case NUMERIC_LIT:
return token(NUMBER);

case IDENTIFIER:
return token(VARIABLE);
case HCLLexer.IDENTIFIER:
return token(HCLTokenId.IDENTIFIER);

case FOR:
case IF:
Expand Down Expand Up @@ -93,9 +106,10 @@ protected Token<HCLTokenId> mapToken(org.antlr.v4.runtime.Token antlrToken) {
return token(OPERATOR);

case QUOTE:
return token(STRING);
case HEREDOC_START:
case HEREDOC_END:
return token(STRING);
return token(HEREDOC_GUARD);
case HEREDOC_CONTENT:
return groupToken(HEREDOC, HEREDOC_CONTENT);

Expand All @@ -115,11 +129,39 @@ protected Token<HCLTokenId> mapToken(org.antlr.v4.runtime.Token antlrToken) {
return token(ERROR);
}
}

@Override
public Object state() {
return new LexerState(lexer);
}

private final static ANTLRErrorListener HCL_ERROR_LISTENER = new ANTLRErrorListener() {
@Override
public void syntaxError(Recognizer<?, ?> recognizer, Object offendingObject, int line, int charPositionInLine, String msg, RecognitionException e) {
LOG.log(Level.SEVERE, msg);
throw new ParseCancellationException(e);
}

@Override
public void reportAmbiguity(Parser parser, DFA dfa, int i, int i1, boolean bln, BitSet bitset, ATNConfigSet atncs) {
}

@Override
public void reportAttemptingFullContext(Parser parser, DFA dfa, int i, int i1, BitSet bitset, ATNConfigSet atncs) {
}

@Override
public void reportContextSensitivity(Parser parser, DFA dfa, int i, int i1, int i2, ATNConfigSet atncs) {
}
};

private static HCLLexer createLexer(CharStream input) {
HCLLexer lexer = new HCLLexer(input);
lexer.removeErrorListeners();
lexer.addErrorListener(HCL_ERROR_LISTENER);
return lexer;
}

private static class LexerState extends AbstractAntlrLexerBridge.LexerState<HCLLexer> {
final String currentHereDocVar;
final LinkedList<String> hereDocStack = new LinkedList<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,18 +37,18 @@ import HCLLexerBasics;
}

private boolean heredocEndAhead(String partialHeredoc) {
if (this.getCharPositionInLine() != 0) {
// If the lexer is not at the start of a line, no end-delimiter can be possible
return false;
int n = 1;
int c = _input.LA(1);
while ( c == 9 || c == 32) { // Skip leading space and tabs
c = _input.LA(++n);
}

for (int n = 1; n < currentHereDocVar.length(); n++) {
if (this._input.LA(n) != currentHereDocVar.charAt(n - 1)) {
for (int v = 0; v < currentHereDocVar.length(); v++) {
if (this._input.LA(n + v) != currentHereDocVar.charAt(v)) {
return false;
}
}

int charAfterDelimiter = this._input.LA(currentHereDocVar.length() + 1);
int charAfterDelimiter = this._input.LA(currentHereDocVar.length() + n);

return charAfterDelimiter == EOF || Character.isWhitespace(charAfterDelimiter);
}
Expand Down Expand Up @@ -239,7 +239,7 @@ TEMPLATE_START
;

STRING_END
: DQuote -> type(QUOTE), popMode
: DQuote -> type(QUOTE), popMode
;

STRING_CONTENT
Expand Down Expand Up @@ -281,7 +281,7 @@ TEMPLATE_CONTENT
mode HEREDOC_MODE;

HEREDOC_END
: ({heredocEndAhead(getText())}? Letter LetterDigit*) {popHereDocVar();} -> popMode
: ({heredocEndAhead(getText())}? Hws* Letter LetterDigit*) {popHereDocVar();} -> popMode
;

H_INTERPOLATION_ESCAPE
Expand All @@ -298,4 +298,8 @@ H_TEMPLATE_START

HEREDOC_CONTENT
: ({!heredocEndAhead(getText())}? .)
;

HEREDOC_ERR
: . -> type(ERRCHAR)
;

0 comments on commit 9db2623

Please sign in to comment.