JET-142 Support string templates:
Make '$' in short entries a separate token
This commit is contained in:
@@ -577,7 +577,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
||||
/*
|
||||
* stringTemplateElement
|
||||
* : RegularStringPart
|
||||
* : ShortTemplateEntry
|
||||
* : ShortTemplateEntrySTART SimpleName
|
||||
* : EscapeSequence
|
||||
* : longTemplate
|
||||
* ;
|
||||
@@ -597,11 +597,12 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
||||
advance(); // ESCAPE_SEQUENCE
|
||||
mark.done(ESCAPE_STRING_TEMPLATE_ENTRY);
|
||||
}
|
||||
else if (at(SHORT_TEMPLATE_ENTRY)) {
|
||||
else if (at(SHORT_TEMPLATE_ENTRY_START)) {
|
||||
PsiBuilder.Marker entry = mark();
|
||||
advance(); // SHORT_TEMPLATE_ENTRY_START
|
||||
|
||||
PsiBuilder.Marker reference = mark();
|
||||
advance(); // SHORT_TEMPLATE_ENTRY
|
||||
expect(IDENTIFIER, "Expecting a name");
|
||||
reference.done(REFERENCE_EXPRESSION);
|
||||
|
||||
entry.done(SHORT_STRING_TEMPLATE_ENTRY);
|
||||
@@ -613,7 +614,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
|
||||
|
||||
parseExpression();
|
||||
|
||||
expect(LONG_TEMPLATE_ENTRY_END, "Expecting '}'", TokenSet.create(CLOSING_QUOTE, DANGLING_NEWLINE, REGULAR_STRING_PART, ESCAPE_SEQUENCE, SHORT_TEMPLATE_ENTRY));
|
||||
expect(LONG_TEMPLATE_ENTRY_END, "Expecting '}'", TokenSet.create(CLOSING_QUOTE, DANGLING_NEWLINE, REGULAR_STRING_PART, ESCAPE_SEQUENCE, SHORT_TEMPLATE_ENTRY_START));
|
||||
longTemplateEntry.done(LONG_STRING_TEMPLATE_ENTRY);
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -29,7 +29,7 @@ import java.util.List;
|
||||
* @author max
|
||||
*/
|
||||
public class JetSimpleNameExpression extends JetReferenceExpression {
|
||||
public static final TokenSet REFERENCE_TOKENS = TokenSet.orSet(JetTokens.LABELS, TokenSet.create(JetTokens.IDENTIFIER, JetTokens.FIELD_IDENTIFIER, JetTokens.THIS_KEYWORD, JetTokens.SHORT_TEMPLATE_ENTRY));
|
||||
public static final TokenSet REFERENCE_TOKENS = TokenSet.orSet(JetTokens.LABELS, TokenSet.create(JetTokens.IDENTIFIER, JetTokens.FIELD_IDENTIFIER, JetTokens.THIS_KEYWORD));
|
||||
|
||||
public JetSimpleNameExpression(@NotNull ASTNode node) {
|
||||
super(node);
|
||||
@@ -42,9 +42,6 @@ public class JetSimpleNameExpression extends JetReferenceExpression {
|
||||
return null;
|
||||
}
|
||||
String text = referencedNameElement.getNode().getText();
|
||||
if (referencedNameElement.getNode().getElementType() == JetTokens.SHORT_TEMPLATE_ENTRY) {
|
||||
text = text.substring(1); // Strip the '$'
|
||||
}
|
||||
if (text.startsWith("`") && text.endsWith("`") && text.length() >= 2) {
|
||||
return text.substring(1, text.length()-1);
|
||||
}
|
||||
|
||||
@@ -7,7 +7,6 @@ import com.google.common.collect.Sets;
|
||||
import com.intellij.lang.ASTNode;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.tree.IElementType;
|
||||
import com.intellij.psi.tree.TokenSet;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.jet.JetNodeTypes;
|
||||
@@ -866,7 +865,7 @@ public class JetTypeInferrer {
|
||||
}
|
||||
}
|
||||
else {
|
||||
assert TokenSet.create(JetTokens.IDENTIFIER, JetTokens.SHORT_TEMPLATE_ENTRY).contains(expression.getReferencedNameElementType());
|
||||
assert JetTokens.IDENTIFIER == expression.getReferencedNameElementType();
|
||||
if (referencedName != null) {
|
||||
VariableDescriptor variable = context.scope.getVariable(referencedName);
|
||||
if (variable != null) {
|
||||
|
||||
@@ -46,8 +46,8 @@ import org.jetbrains.jet.lexer.JetTokens;
|
||||
%eof{ return;
|
||||
%eof}
|
||||
|
||||
%xstate STRING
|
||||
%state LONG_TEMPLATE
|
||||
%xstate STRING SHORT_TEMPLATE_ENTRY
|
||||
%state LONG_TEMPLATE_ENTRY
|
||||
|
||||
DIGIT=[0-9]
|
||||
HEX_DIGIT=[0-9A-Fa-f]
|
||||
@@ -117,12 +117,18 @@ LONG_TEMPLATE_ENTRY_END=\}
|
||||
<STRING> \n { popState(); yypushback(1); return JetTokens.DANGLING_NEWLINE; }
|
||||
<STRING> {REGULAR_STRING_PART} { return JetTokens.REGULAR_STRING_PART; }
|
||||
<STRING> {ESCAPE_SEQUENCE} { return JetTokens.ESCAPE_SEQUENCE; }
|
||||
<STRING> {SHORT_TEMPLATE_ENTRY} { return JetTokens.SHORT_TEMPLATE_ENTRY; }
|
||||
<STRING> {LONELY_DOLLAR} { return JetTokens.REGULAR_STRING_PART; }
|
||||
<STRING> {LONG_TEMPLATE_ENTRY_START} { pushState(LONG_TEMPLATE); return JetTokens.LONG_TEMPLATE_ENTRY_START; }
|
||||
<STRING> {SHORT_TEMPLATE_ENTRY} {
|
||||
pushState(SHORT_TEMPLATE_ENTRY);
|
||||
yypushback(yylength() - 1);
|
||||
return JetTokens.SHORT_TEMPLATE_ENTRY_START;
|
||||
}
|
||||
<SHORT_TEMPLATE_ENTRY> {IDENTIFIER} { popState(); return JetTokens.IDENTIFIER; }
|
||||
|
||||
<LONG_TEMPLATE> "{" { lBraceCount++; return JetTokens.LBRACE; }
|
||||
<LONG_TEMPLATE> "}" {
|
||||
<STRING> {LONELY_DOLLAR} { return JetTokens.REGULAR_STRING_PART; }
|
||||
<STRING> {LONG_TEMPLATE_ENTRY_START} { pushState(LONG_TEMPLATE_ENTRY); return JetTokens.LONG_TEMPLATE_ENTRY_START; }
|
||||
|
||||
<LONG_TEMPLATE_ENTRY> "{" { lBraceCount++; return JetTokens.LBRACE; }
|
||||
<LONG_TEMPLATE_ENTRY> "}" {
|
||||
if (lBraceCount == 0) {
|
||||
popState();
|
||||
return JetTokens.LONG_TEMPLATE_ENTRY_END;
|
||||
|
||||
@@ -25,8 +25,8 @@ public interface JetTokens {
|
||||
JetToken CLOSING_QUOTE = new JetToken("CLOSING_QUOTE");
|
||||
JetToken OPEN_QUOTE = new JetToken("OPEN_QUOTE");
|
||||
JetToken REGULAR_STRING_PART = new JetToken("REGULAR_STRING_PART");
|
||||
JetToken SHORT_TEMPLATE_ENTRY = new JetToken("SHORT_TEMPLATE_ENTRY");
|
||||
JetToken ESCAPE_SEQUENCE = new JetToken("ESCAPE_SEQUENCE");
|
||||
JetToken SHORT_TEMPLATE_ENTRY_START = new JetToken("SHORT_TEMPLATE_ENTRY_START");
|
||||
JetToken LONG_TEMPLATE_ENTRY_START = new JetToken("LONG_TEMPLATE_ENTRY_START");
|
||||
JetToken LONG_TEMPLATE_ENTRY_END = new JetToken("LONG_TEMPLATE_ENTRY_END");
|
||||
JetToken DANGLING_NEWLINE = new JetToken("DANGLING_NEWLINE");
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -121,6 +121,7 @@ public class JetHighlighter extends SyntaxHighlighterBase {
|
||||
keys1.put(JetTokens.REGULAR_STRING_PART, JET_STRING);
|
||||
keys1.put(JetTokens.LONG_TEMPLATE_ENTRY_END, JET_STRING_ESCAPE);
|
||||
keys1.put(JetTokens.LONG_TEMPLATE_ENTRY_START, JET_STRING_ESCAPE);
|
||||
keys1.put(JetTokens.SHORT_TEMPLATE_ENTRY_START, JET_STRING_ESCAPE);
|
||||
|
||||
keys1.put(JetTokens.ESCAPE_SEQUENCE, JET_STRING_ESCAPE);
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ fun demo() {
|
||||
"$.$.asdf$\t"
|
||||
"asd\$"
|
||||
"asd$a<error>\x</error>"
|
||||
"asd$a$asd$ <error>$xxx</error>"
|
||||
"asd$a$asd$ $<error>xxx</error>"
|
||||
"fosdfasdo${1 + bar + 100}}sdsdfgdsfsdf"
|
||||
"foo${bar + map {foo}}sdfsdf"
|
||||
"foo${bar + map { "foo" }}sdfsdf"
|
||||
|
||||
@@ -158,15 +158,17 @@ JetFile: StringTemplates.jet
|
||||
STRING_TEMPLATE
|
||||
PsiElement(OPEN_QUOTE)('"')
|
||||
SHORT_STRING_TEMPLATE_ENTRY
|
||||
PsiElement(SHORT_TEMPLATE_ENTRY_START)('$')
|
||||
REFERENCE_EXPRESSION
|
||||
PsiElement(SHORT_TEMPLATE_ENTRY)('$abc')
|
||||
PsiElement(IDENTIFIER)('abc')
|
||||
PsiElement(CLOSING_QUOTE)('"')
|
||||
PsiWhiteSpace('\n ')
|
||||
STRING_TEMPLATE
|
||||
PsiElement(OPEN_QUOTE)('"')
|
||||
SHORT_STRING_TEMPLATE_ENTRY
|
||||
PsiElement(SHORT_TEMPLATE_ENTRY_START)('$')
|
||||
REFERENCE_EXPRESSION
|
||||
PsiElement(SHORT_TEMPLATE_ENTRY)('$abc')
|
||||
PsiElement(IDENTIFIER)('abc')
|
||||
ESCAPE_STRING_TEMPLATE_ENTRY
|
||||
PsiElement(ESCAPE_SEQUENCE)('\"')
|
||||
PsiErrorElement:Expecting '"'
|
||||
@@ -207,8 +209,9 @@ JetFile: StringTemplates.jet
|
||||
LITERAL_STRING_TEMPLATE_ENTRY
|
||||
PsiElement(REGULAR_STRING_PART)('asd')
|
||||
SHORT_STRING_TEMPLATE_ENTRY
|
||||
PsiElement(SHORT_TEMPLATE_ENTRY_START)('$')
|
||||
REFERENCE_EXPRESSION
|
||||
PsiElement(SHORT_TEMPLATE_ENTRY)('$a')
|
||||
PsiElement(IDENTIFIER)('a')
|
||||
PsiElement(CLOSING_QUOTE)('"')
|
||||
PsiWhiteSpace('\n ')
|
||||
STRING_TEMPLATE
|
||||
@@ -216,11 +219,13 @@ JetFile: StringTemplates.jet
|
||||
LITERAL_STRING_TEMPLATE_ENTRY
|
||||
PsiElement(REGULAR_STRING_PART)('asd')
|
||||
SHORT_STRING_TEMPLATE_ENTRY
|
||||
PsiElement(SHORT_TEMPLATE_ENTRY_START)('$')
|
||||
REFERENCE_EXPRESSION
|
||||
PsiElement(SHORT_TEMPLATE_ENTRY)('$a')
|
||||
PsiElement(IDENTIFIER)('a')
|
||||
SHORT_STRING_TEMPLATE_ENTRY
|
||||
PsiElement(SHORT_TEMPLATE_ENTRY_START)('$')
|
||||
REFERENCE_EXPRESSION
|
||||
PsiElement(SHORT_TEMPLATE_ENTRY)('$asd')
|
||||
PsiElement(IDENTIFIER)('asd')
|
||||
LITERAL_STRING_TEMPLATE_ENTRY
|
||||
PsiElement(REGULAR_STRING_PART)('$')
|
||||
PsiElement(CLOSING_QUOTE)('"')
|
||||
@@ -342,8 +347,9 @@ JetFile: StringTemplates.jet
|
||||
LITERAL_STRING_TEMPLATE_ENTRY
|
||||
PsiElement(REGULAR_STRING_PART)('foo')
|
||||
SHORT_STRING_TEMPLATE_ENTRY
|
||||
PsiElement(SHORT_TEMPLATE_ENTRY_START)('$')
|
||||
REFERENCE_EXPRESSION
|
||||
PsiElement(SHORT_TEMPLATE_ENTRY)('$sdf')
|
||||
PsiElement(IDENTIFIER)('sdf')
|
||||
LONG_STRING_TEMPLATE_ENTRY
|
||||
PsiElement(LONG_TEMPLATE_ENTRY_START)('${')
|
||||
PsiWhiteSpace(' ')
|
||||
|
||||
@@ -62,8 +62,9 @@ JetFile: Builder.jet
|
||||
STRING_TEMPLATE
|
||||
PsiElement(OPEN_QUOTE)('"')
|
||||
SHORT_STRING_TEMPLATE_ENTRY
|
||||
PsiElement(SHORT_TEMPLATE_ENTRY_START)('$')
|
||||
REFERENCE_EXPRESSION
|
||||
PsiElement(SHORT_TEMPLATE_ENTRY)('$libs')
|
||||
PsiElement(IDENTIFIER)('libs')
|
||||
LITERAL_STRING_TEMPLATE_ENTRY
|
||||
PsiElement(REGULAR_STRING_PART)('/groovy-...')
|
||||
PsiElement(CLOSING_QUOTE)('"')
|
||||
@@ -108,8 +109,9 @@ JetFile: Builder.jet
|
||||
STRING_TEMPLATE
|
||||
PsiElement(OPEN_QUOTE)('"')
|
||||
SHORT_STRING_TEMPLATE_ENTRY
|
||||
PsiElement(SHORT_TEMPLATE_ENTRY_START)('$')
|
||||
REFERENCE_EXPRESSION
|
||||
PsiElement(SHORT_TEMPLATE_ENTRY)('$gantHome')
|
||||
PsiElement(IDENTIFIER)('gantHome')
|
||||
LITERAL_STRING_TEMPLATE_ENTRY
|
||||
PsiElement(REGULAR_STRING_PART)('/lib')
|
||||
PsiElement(CLOSING_QUOTE)('"')
|
||||
@@ -209,8 +211,9 @@ JetFile: Builder.jet
|
||||
STRING_TEMPLATE
|
||||
PsiElement(OPEN_QUOTE)('"')
|
||||
SHORT_STRING_TEMPLATE_ENTRY
|
||||
PsiElement(SHORT_TEMPLATE_ENTRY_START)('$')
|
||||
REFERENCE_EXPRESSION
|
||||
PsiElement(SHORT_TEMPLATE_ENTRY)('$projectHome')
|
||||
PsiElement(IDENTIFIER)('projectHome')
|
||||
LITERAL_STRING_TEMPLATE_ENTRY
|
||||
PsiElement(REGULAR_STRING_PART)('/antLayout/src')
|
||||
PsiElement(CLOSING_QUOTE)('"')
|
||||
|
||||
@@ -7,15 +7,15 @@ fun demo() {
|
||||
~buzz~fun buzz(f : fun () : Any?) : Int = 1
|
||||
~sdf~val sdf = 1
|
||||
~foo~val foo = 3;
|
||||
"`abc`$abc"
|
||||
"$`abc`abc"
|
||||
"$"
|
||||
"$.$.asdf$\t"
|
||||
"asd\$"
|
||||
"asd`a`$a"
|
||||
"asd`a`$a`asd`$asd$"
|
||||
"asd$`a`a"
|
||||
"asd$`a`a$`asd`asd$"
|
||||
"fosdfasdo${1 + `bar`bar + 100}}sdsdfgdsfsdf"
|
||||
"foo${`bar`bar + `map`map {`foo`foo}}sdfsdf"
|
||||
"foo${`bar`bar + `map`map { "foo" }}sdfsdf"
|
||||
"foo${`bar`bar + `map`map {
|
||||
"foo`sdf`$sdf${ `buzz`buzz{}}" }}sdfsdf"
|
||||
"foo$`sdf`sdf${ `buzz`buzz{}}" }}sdfsdf"
|
||||
}
|
||||
Reference in New Issue
Block a user