Skip to content

Commit

Permalink
More flexible require syntax
Browse files Browse the repository at this point in the history
  • Loading branch information
kinglozzer committed Sep 27, 2021
1 parent 1bfda49 commit 5dbaa80
Show file tree
Hide file tree
Showing 8 changed files with 378 additions and 440 deletions.
737 changes: 337 additions & 400 deletions src/main/gen/com/kinglozzer/silverstripe/parser/_SilverstripeLexer.java

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -84,11 +84,7 @@ public class SilverstripeSyntaxHighlighter extends SyntaxHighlighterBase {
private static final TokenSet IDENTIFIER_TOKENS = TokenSet.create(
SilverstripeTokenTypes.SS_IDENTIFIER,
SilverstripeTokenTypes.SS_INCLUDE_FILE,
SilverstripeTokenTypes.SS_TRANSLATION_IDENTIFIER,
SilverstripeTokenTypes.SS_REQUIRE_CSS,
SilverstripeTokenTypes.SS_REQUIRE_THEMED_CSS,
SilverstripeTokenTypes.SS_REQUIRE_JS,
SilverstripeTokenTypes.SS_REQUIRE_THEMED_JS
SilverstripeTokenTypes.SS_TRANSLATION_IDENTIFIER
);

private static final TokenSet KEYWORD_TOKENS = TokenSet.create(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,21 @@ public void annotate(@NotNull final PsiElement element, @NotNull AnnotationHolde
if (varValue != null && !varValue.startsWith("$")) {
// We only want to warn if this is the first step in the lookup chain
if (element.getPrevSibling() == null) {
PsiElement lookup = element.getParent();
if (lookup == null) {
return;
}

// If this is the first lookup inside a require statement, ignore it - "css" in <% require css() %>
// is treated as a non-dollar-prefixed lookup
PsiElement context = lookup.getParent();
if (context != null
&& context.getNode() != null
&& context.getNode().getElementType() == SilverstripeTokenTypes.SS_REQUIRE_STATEMENT
) {
return;
}

AnnotationBuilder builder = holder.newAnnotation(HighlightSeverity.WARNING,
SilverstripeBundle.message("ss.inspection.unquoted.string"))
.withFix(new AddDollarSignFix());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,6 @@ SS_TEXT= (([^<${\\]+) | (\\.) | (<[^%]) | (\$[^A-Za-z_]) | (\{[^\$]) | (\{\$[^A-
%state SS_TRANSLATION_STATEMENT
%state SS_CACHED_STATEMENT
%state SS_REQUIRE_STATEMENT
%state SS_REQUIRE_CONTENT
%state SS_INCLUDE_VARS
%state SS_NAMED_VAR
%state SS_COMMENT
Expand Down Expand Up @@ -188,20 +187,7 @@ SS_TEXT= (([^<${\\]+) | (\\.) | (<[^%]) | (\$[^A-Za-z_]) | (\{[^\$]) | (\{\$[^A-
}

<SS_REQUIRE_STATEMENT> {
"css" { return SilverstripeTokenTypes.SS_REQUIRE_CSS; }
"javascript" { return SilverstripeTokenTypes.SS_REQUIRE_JS; }
"themedCSS" { return SilverstripeTokenTypes.SS_REQUIRE_THEMED_CSS; }
"themedJavascript" { return SilverstripeTokenTypes.SS_REQUIRE_THEMED_JS; }
"(" { yypushstate(SS_REQUIRE_CONTENT); return SilverstripeTokenTypes.SS_LEFT_PARENTHESIS; }
{WHITE_SPACE}+ { return TokenType.WHITE_SPACE; }
{CRLF}+ { yypushback(yylength()); yypopstate(); }
. { yypushback(yylength()); yypopstate(); }
}

<SS_REQUIRE_CONTENT> {
")" { yypopstate(); return SilverstripeTokenTypes.SS_RIGHT_PARENTHESIS; }
{SS_STRING} { return SilverstripeTokenTypes.SS_STRING; }
{SS_STRING_NO_QUOTES} { return SilverstripeTokenTypes.SS_STRING; }
{SS_IDENTIFIER} { yypushstate(SS_LOOKUP); return SilverstripeTokenTypes.SS_LOOKUP; }
{WHITE_SPACE}+ { return TokenType.WHITE_SPACE; }
{CRLF}+ { yypushback(yylength()); yypopstate(); }
. { yypushback(yylength()); yypopstate(); }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -195,14 +195,6 @@ private boolean parseStatement(PsiBuilder builder) {
return true;
}

if (tokenType == SS_REQUIRE_CSS || tokenType == SS_REQUIRE_JS || tokenType == SS_REQUIRE_THEMED_CSS || tokenType == SS_REQUIRE_THEMED_JS) {
consumeToken(builder, tokenType);
if (builder.getTokenType() == SS_LEFT_PARENTHESIS) {
parseLookupStepArguments(builder);
}
return true;
}

if (tokenType == SS_AND_OR_OPERATOR || tokenType == SS_COMPARISON_OPERATOR) {
builder.advanceLexer();
return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,12 +66,6 @@ public final class SilverstripeTokenTypes {
// Include tokens
public static final IElementType SS_INCLUDE_FILE = new SilverstripeTokenType("SS_INCLUDE_FILE");

// Require tokens
public static final IElementType SS_REQUIRE_CSS = new SilverstripeTokenType("SS_REQUIRE_CSS");
public static final IElementType SS_REQUIRE_THEMED_CSS = new SilverstripeTokenType("SS_REQUIRE_THEMED_CSS");
public static final IElementType SS_REQUIRE_JS = new SilverstripeTokenType("SS_REQUIRE_JS");
public static final IElementType SS_REQUIRE_THEMED_JS = new SilverstripeTokenType("SS_REQUIRE_THEMED_JS");

// Special text tokens
public static final IElementType SS_STRING = new SilverstripeTokenType("SS_STRING");
public static final IElementType SS_NUMBER = new SilverstripeTokenType("SS_NUMBER");
Expand Down
3 changes: 2 additions & 1 deletion src/test/testData/parser/Require.ss
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
<% require themedCSS('dist/style') %>
<% require themedCSS('dist/style') %>
<% require insertHeadTags('<link href="//google.com" rel="dns-prefetch" />') %>
27 changes: 22 additions & 5 deletions src/test/testData/parser/Require.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,27 @@ FILE
PsiWhiteSpace(' ')
PsiElement(SS_REQUIRE_KEYWORD)('require')
PsiWhiteSpace(' ')
PsiElement(SS_REQUIRE_THEMED_CSS)('themedCSS')
PsiElement(SS_LEFT_PARENTHESIS)('(')
SilverstripePsiElementImpl([Ss] SS_LOOKUP_STEP_ARGS)
PsiElement(SS_STRING)(''dist/style'')
PsiElement(SS_RIGHT_PARENTHESIS)(')')
SilverstripePsiElementImpl([Ss] SS_LOOKUP)
SilverstripeLookupStepImpl([Ss] SS_LOOKUP_STEP)
PsiElement([Ss] SS_LOOKUP)('themedCSS')
PsiElement(SS_LEFT_PARENTHESIS)('(')
SilverstripePsiElementImpl([Ss] SS_LOOKUP_STEP_ARGS)
PsiElement(SS_STRING)(''dist/style'')
PsiElement(SS_RIGHT_PARENTHESIS)(')')
PsiWhiteSpace(' ')
PsiElement(SS_BLOCK_END)('%>')
PsiWhiteSpace('\n')
SilverstripePsiElementImpl([Ss] SS_REQUIRE_STATEMENT)
PsiElement(SS_BLOCK_START)('<%')
PsiWhiteSpace(' ')
PsiElement(SS_REQUIRE_KEYWORD)('require')
PsiWhiteSpace(' ')
SilverstripePsiElementImpl([Ss] SS_LOOKUP)
SilverstripeLookupStepImpl([Ss] SS_LOOKUP_STEP)
PsiElement([Ss] SS_LOOKUP)('insertHeadTags')
PsiElement(SS_LEFT_PARENTHESIS)('(')
SilverstripePsiElementImpl([Ss] SS_LOOKUP_STEP_ARGS)
PsiElement(SS_STRING)(''<link href="//google.com" rel="dns-prefetch" />'')
PsiElement(SS_RIGHT_PARENTHESIS)(')')
PsiWhiteSpace(' ')
PsiElement(SS_BLOCK_END)('%>')

0 comments on commit 5dbaa80

Please sign in to comment.