Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(139)

Side by Side Diff: pkg/analyzer/lib/src/generated/parser.dart

Issue 2304923002: Allow surrogates in string literals. (Closed)
Patch Set: Include analyzer and spec changes. Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library analyzer.src.generated.parser; 5 library analyzer.src.generated.parser;
6 6
7 import 'dart:collection'; 7 import 'dart:collection';
8 import "dart:math" as math; 8 import "dart:math" as math;
9 9
10 import 'package:analyzer/dart/ast/ast.dart'; 10 import 'package:analyzer/dart/ast/ast.dart';
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
89 0, (Parser target) => target.parseTypeArgumentList()), 89 0, (Parser target) => target.parseTypeArgumentList()),
90 'parseTypeName_0': 90 'parseTypeName_0':
91 new MethodTrampoline(0, (Parser target) => target.parseTypeName()), 91 new MethodTrampoline(0, (Parser target) => target.parseTypeName()),
92 'parseTypeParameter_0': 92 'parseTypeParameter_0':
93 new MethodTrampoline(0, (Parser target) => target.parseTypeParameter()), 93 new MethodTrampoline(0, (Parser target) => target.parseTypeParameter()),
94 'parseTypeParameterList_0': new MethodTrampoline( 94 'parseTypeParameterList_0': new MethodTrampoline(
95 0, (Parser target) => target.parseTypeParameterList()), 95 0, (Parser target) => target.parseTypeParameterList()),
96 'parseWithClause_0': 96 'parseWithClause_0':
97 new MethodTrampoline(0, (Parser target) => target.parseWithClause()), 97 new MethodTrampoline(0, (Parser target) => target.parseWithClause()),
98 'advance_0': new MethodTrampoline(0, (Parser target) => target._advance()), 98 'advance_0': new MethodTrampoline(0, (Parser target) => target._advance()),
99 'appendScalarValue_5': new MethodTrampoline( 99 'appendCodePoint_5': new MethodTrampoline(
100 5, 100 5,
101 (Parser target, arg0, arg1, arg2, arg3, arg4) => 101 (Parser target, arg0, arg1, arg2, arg3, arg4) =>
102 target._appendScalarValue(arg0, arg1, arg2, arg3, arg4)), 102 target._appendCodePoint(arg0, arg1, arg2, arg3, arg4)),
103 'computeStringValue_3': new MethodTrampoline( 103 'computeStringValue_3': new MethodTrampoline(
104 3, 104 3,
105 (Parser target, arg0, arg1, arg2) => 105 (Parser target, arg0, arg1, arg2) =>
106 target._computeStringValue(arg0, arg1, arg2)), 106 target._computeStringValue(arg0, arg1, arg2)),
107 'convertToFunctionDeclaration_1': new MethodTrampoline( 107 'convertToFunctionDeclaration_1': new MethodTrampoline(
108 1, (Parser target, arg0) => target._convertToFunctionDeclaration(arg0)), 108 1, (Parser target, arg0) => target._convertToFunctionDeclaration(arg0)),
109 'couldBeStartOfCompilationUnitMember_0': new MethodTrampoline( 109 'couldBeStartOfCompilationUnitMember_0': new MethodTrampoline(
110 0, (Parser target) => target._couldBeStartOfCompilationUnitMember()), 110 0, (Parser target) => target._couldBeStartOfCompilationUnitMember()),
111 'createSyntheticIdentifier_0': new MethodTrampoline( 111 'createSyntheticIdentifier_0': new MethodTrampoline(
112 0, (Parser target) => target._createSyntheticIdentifier()), 112 0, (Parser target) => target._createSyntheticIdentifier()),
(...skipping 1956 matching lines...) Expand 10 before | Expand all | Expand 10 after
2069 } 2069 }
2070 2070
2071 /** 2071 /**
2072 * Advance to the next token in the token stream. 2072 * Advance to the next token in the token stream.
2073 */ 2073 */
2074 void _advance() { 2074 void _advance() {
2075 _currentToken = _currentToken.next; 2075 _currentToken = _currentToken.next;
2076 } 2076 }
2077 2077
2078 /** 2078 /**
2079 * Append the character equivalent of the given [scalarValue] to the given 2079 * Append the character equivalent of the given [codePoint] to the given
2080 * [builder]. Use the [startIndex] and [endIndex] to report an error, and 2080 * [builder]. Use the [startIndex] and [endIndex] to report an error, and
2081 * don't append anything to the builder, if the scalar value is invalid. The 2081 * don't append anything to the builder, if the code point is invalid. The
2082 * [escapeSequence] is the escape sequence that was parsed to produce the 2082 * [escapeSequence] is the escape sequence that was parsed to produce the
2083 * scalar value (used for error reporting). 2083 * code point (used for error reporting).
2084 */ 2084 */
2085 void _appendScalarValue(StringBuffer buffer, String escapeSequence, 2085 void _appendCodePoint(StringBuffer buffer, String source,
2086 int scalarValue, int startIndex, int endIndex) { 2086 int codePoint, int startIndex, int endIndex) {
2087 if (scalarValue < 0 || 2087 if (codePoint < 0 || codePoint > Character.MAX_CODE_POINT) {
2088 scalarValue > Character.MAX_CODE_POINT || 2088 String escapeSequence = source.substring(startIndex, endIndex + 1);
2089 (scalarValue >= 0xD800 && scalarValue <= 0xDFFF)) {
2090 _reportErrorForCurrentToken( 2089 _reportErrorForCurrentToken(
2091 ParserErrorCode.INVALID_CODE_POINT, [escapeSequence]); 2090 ParserErrorCode.INVALID_CODE_POINT, [escapeSequence]);
2092 return; 2091 return;
2093 } 2092 }
2094 if (scalarValue < Character.MAX_VALUE) { 2093 if (codePoint < Character.MAX_VALUE) {
2095 buffer.writeCharCode(scalarValue); 2094 buffer.writeCharCode(codePoint);
2096 } else { 2095 } else {
2097 buffer.write(Character.toChars(scalarValue)); 2096 buffer.write(Character.toChars(codePoint));
2098 } 2097 }
2099 } 2098 }
2100 2099
2101 /** 2100 /**
2102 * Return the content of a string with the given literal representation. The 2101 * Return the content of a string with the given literal representation. The
2103 * [lexeme] is the literal representation of the string. The flag [isFirst] is 2102 * [lexeme] is the literal representation of the string. The flag [isFirst] is
2104 * `true` if this is the first token in a string literal. The flag [isLast] is 2103 * `true` if this is the first token in a string literal. The flag [isLast] is
2105 * `true` if this is the last token in a string literal. 2104 * `true` if this is the last token in a string literal.
2106 */ 2105 */
2107 String _computeStringValue(String lexeme, bool isFirst, bool isLast) { 2106 String _computeStringValue(String lexeme, bool isFirst, bool isLast) {
(...skipping 5978 matching lines...) Expand 10 before | Expand all | Expand 10 after
8086 // Illegal escape sequence: incomplete escape 8085 // Illegal escape sequence: incomplete escape
8087 _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE); 8086 _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE);
8088 return length; 8087 return length;
8089 } 8088 }
8090 currentChar = lexeme.codeUnitAt(currentIndex); 8089 currentChar = lexeme.codeUnitAt(currentIndex);
8091 } 8090 }
8092 if (digitCount < 1 || digitCount > 6) { 8091 if (digitCount < 1 || digitCount > 6) {
8093 // Illegal escape sequence: not enough or too many hex digits 8092 // Illegal escape sequence: not enough or too many hex digits
8094 _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE); 8093 _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE);
8095 } 8094 }
8096 _appendScalarValue(buffer, lexeme.substring(index, currentIndex + 1), 8095 _appendCodePoint(buffer, lexeme, value, index, currentIndex);
Lasse Reichstein Nielsen 2016/09/15 11:18:44 There was no need to create a new substring when y
floitsch 2016/09/15 15:09:19 Acknowledged.
8097 value, index, currentIndex);
8098 return currentIndex + 1; 8096 return currentIndex + 1;
8099 } else { 8097 } else {
8100 if (currentIndex + 3 >= length) { 8098 if (currentIndex + 3 >= length) {
8101 // Illegal escape sequence: not enough hex digits 8099 // Illegal escape sequence: not enough hex digits
8102 _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE); 8100 _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE);
8103 return length; 8101 return length;
8104 } 8102 }
8105 int firstDigit = currentChar; 8103 int firstDigit = currentChar;
8106 int secondDigit = lexeme.codeUnitAt(currentIndex + 1); 8104 int secondDigit = lexeme.codeUnitAt(currentIndex + 1);
8107 int thirdDigit = lexeme.codeUnitAt(currentIndex + 2); 8105 int thirdDigit = lexeme.codeUnitAt(currentIndex + 2);
8108 int fourthDigit = lexeme.codeUnitAt(currentIndex + 3); 8106 int fourthDigit = lexeme.codeUnitAt(currentIndex + 3);
8109 if (!_isHexDigit(firstDigit) || 8107 if (!_isHexDigit(firstDigit) ||
8110 !_isHexDigit(secondDigit) || 8108 !_isHexDigit(secondDigit) ||
8111 !_isHexDigit(thirdDigit) || 8109 !_isHexDigit(thirdDigit) ||
8112 !_isHexDigit(fourthDigit)) { 8110 !_isHexDigit(fourthDigit)) {
8113 // Illegal escape sequence: invalid hex digits 8111 // Illegal escape sequence: invalid hex digits
8114 _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE); 8112 _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE);
8115 } else { 8113 } else {
8116 _appendScalarValue( 8114 _appendCodePoint(
Lasse Reichstein Nielsen 2016/09/15 11:18:44 Retained the call to _appendCodePoint here, but it
floitsch 2016/09/15 15:09:19 Acknowledged.
8117 buffer, 8115 buffer,
8118 lexeme.substring(index, currentIndex + 1), 8116 lexeme,
Lasse Reichstein Nielsen 2016/09/15 11:18:43 +1 here should have been +4.
8119 (((((Character.digit(firstDigit, 16) << 4) + 8117 (((((Character.digit(firstDigit, 16) << 4) +
8120 Character.digit(secondDigit, 16)) << 8118 Character.digit(secondDigit, 16)) <<
8121 4) + 8119 4) +
8122 Character.digit(thirdDigit, 16)) << 8120 Character.digit(thirdDigit, 16)) <<
8123 4) + 8121 4) +
8124 Character.digit(fourthDigit, 16), 8122 Character.digit(fourthDigit, 16),
8125 index, 8123 index,
8126 currentIndex + 3); 8124 currentIndex + 3);
8127 } 8125 }
8128 return currentIndex + 4; 8126 return currentIndex + 4;
(...skipping 953 matching lines...) Expand 10 before | Expand all | Expand 10 after
9082 */ 9080 */
9083 const ParserErrorCode(String name, String message, [String correction]) 9081 const ParserErrorCode(String name, String message, [String correction])
9084 : super(name, message, correction); 9082 : super(name, message, correction);
9085 9083
9086 @override 9084 @override
9087 ErrorSeverity get errorSeverity => ErrorSeverity.ERROR; 9085 ErrorSeverity get errorSeverity => ErrorSeverity.ERROR;
9088 9086
9089 @override 9087 @override
9090 ErrorType get type => ErrorType.SYNTACTIC_ERROR; 9088 ErrorType get type => ErrorType.SYNTACTIC_ERROR;
9091 } 9089 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698