Apply resolution to AdjacentStrings.

R=brianwilkerson@google.com, paulberry@google.com

Bug:
Change-Id: Iae09b39be41f1ddcd05a5a5ded554a1b7f9c09f3
Reviewed-on: https://dart-review.googlesource.com/25800
Reviewed-by: Paul Berry <paulberry@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
This commit is contained in:
Konstantin Shcheglov 2017-12-04 05:30:03 +00:00 committed by commit-bot@chromium.org
parent bc5b3f28e4
commit 1699831282
11 changed files with 44 additions and 11 deletions

View file

@ -218,7 +218,7 @@ class AstBuilder extends ScopeListener {
scriptTag = ast.scriptTag(token);
}
void handleStringJuxtaposition(int literalCount) {
void handleStringJuxtaposition(int literalCount, Token endToken) {
debugEvent("StringJuxtaposition");
push(ast.adjacentStrings(popList(literalCount)));

View file

@ -49,6 +49,12 @@ class ResolutionApplier extends GeneralizingAstVisitor {
}
}
@override
void visitAdjacentStrings(AdjacentStrings node) {
node.strings.accept(this);
node.staticType = _getTypeFor(node.endToken.next);
}
@override
void visitAsExpression(AsExpression node) {
node.expression.accept(this);

View file

@ -68,6 +68,32 @@ Future pumpEventQueue([int times = 5000]) {
*/
@reflectiveTest
class AnalysisDriverResolutionTest extends BaseAnalysisDriverTest {
test_adjacentStrings() async {
String content = r'''
void main() {
'aaa' 'bbb' 'ccc';
}
''';
addTestFile(content);
AnalysisResult result = await driver.getResult(testFile);
var typeProvider = result.unit.element.context.typeProvider;
List<Statement> statements = _getMainStatements(result);
ExpressionStatement statement = statements[0];
AdjacentStrings expression = statement.expression;
expect(expression.strings, hasLength(3));
StringLiteral literal_1 = expression.strings[0];
expect(literal_1.staticType, typeProvider.stringType);
StringLiteral literal_2 = expression.strings[1];
expect(literal_2.staticType, typeProvider.stringType);
StringLiteral literal_3 = expression.strings[2];
expect(literal_3.staticType, typeProvider.stringType);
}
test_apply_instanceCreation_noTypeArguments() async {
String content = r'''
class C {

View file

@ -942,7 +942,7 @@ class ElementListener extends Listener {
}
@override
void handleStringJuxtaposition(int stringCount) {
void handleStringJuxtaposition(int stringCount, Token endToken) {
assert(stringCount != 0);
Expression accumulator = popNode();
stringCount--;

View file

@ -1400,7 +1400,7 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
}
@override
void handleStringJuxtaposition(int literalCount) {
void handleStringJuxtaposition(int literalCount, Token endToken) {
debugEvent("StringJuxtaposition");
List<Expression> parts = popListForValue(literalCount);
List<Expression> expressions;
@ -1418,7 +1418,8 @@ class BodyBuilder extends ScopeListener<JumpTarget> implements BuilderHelper {
}
}
}
push(new ShadowStringConcatenation(expressions ?? parts));
push(new ShadowStringConcatenation(expressions ?? parts)
..fileOffset = offsetForToken(endToken));
}
@override

View file

@ -1216,8 +1216,8 @@ class ForwardingListener implements Listener {
}
@override
void handleStringJuxtaposition(int literalCount) {
listener?.handleStringJuxtaposition(literalCount);
void handleStringJuxtaposition(int literalCount, Token endToken) {
listener?.handleStringJuxtaposition(literalCount, endToken);
}
@override

View file

@ -605,7 +605,7 @@ class Listener {
logEvent("LiteralString");
}
void handleStringJuxtaposition(int literalCount) {
void handleStringJuxtaposition(int literalCount, Token endToken) {
logEvent("StringJuxtaposition");
}

View file

@ -4917,7 +4917,7 @@ class Parser {
count++;
}
if (count > 1) {
listener.handleStringJuxtaposition(count);
listener.handleStringJuxtaposition(count, token.next);
}
mayParseFunctionExpressions = old;
return token;

View file

@ -324,7 +324,7 @@ class DietListener extends StackListener {
}
@override
void handleStringJuxtaposition(int literalCount) {
void handleStringJuxtaposition(int literalCount, Token endToken) {
debugEvent("StringJuxtaposition");
}

View file

@ -279,7 +279,7 @@ class OutlineBuilder extends UnhandledListener {
}
@override
void handleStringJuxtaposition(int literalCount) {
void handleStringJuxtaposition(int literalCount, Token endToken) {
debugEvent("StringJuxtaposition");
List<String> list =
new List<String>.filled(literalCount, null, growable: false);

View file

@ -299,7 +299,7 @@ abstract class StackListener extends Listener {
}
@override
void handleStringJuxtaposition(int literalCount) {
void handleStringJuxtaposition(int literalCount, Token endToken) {
debugEvent("StringJuxtaposition");
push(popList(literalCount).join(""));
}