mirror of
https://github.com/dart-lang/sdk
synced 2024-09-04 16:03:44 +00:00
Revert last 4 commits by @lrn
Reverted commits: *ef097edad6
. ("Make Analyzer, VM and dart2js accept URI strings as part-of library identifier.") *e8e1857814
. ("Fix bad example of URI part-of to be bad, not good.") *58f7a92ede
. ("Add changelog entry for allowing URI in part-of.") *a4a7d98dce
. ("Use FutureOr in Completer.complete.") TBR=lrn@google.com Review-Url: https://codereview.chromium.org/2724853002 .
This commit is contained in:
parent
a4a7d98dce
commit
9c340f9eb1
|
@ -1,9 +1,5 @@
|
||||||
## 1.23.0
|
## 1.23.0
|
||||||
|
|
||||||
### Language
|
|
||||||
* Allow using URI strings in `part of` declarations to refer to the
|
|
||||||
importing library.
|
|
||||||
|
|
||||||
### Core library changes
|
### Core library changes
|
||||||
* `dart:core`: Added `Uri.isScheme` function to check the scheme of a URI.
|
* `dart:core`: Added `Uri.isScheme` function to check the scheme of a URI.
|
||||||
Example: `uri.isScheme("http")`. Ignores case when comparing.
|
Example: `uri.isScheme("http")`. Ignores case when comparing.
|
||||||
|
|
|
@ -474,8 +474,7 @@ class LibraryAnalyzer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hasPartDirective && libraryNameNode == null &&
|
if (hasPartDirective && libraryNameNode == null) {
|
||||||
!_context.analysisOptions.enableUriInPartOf) {
|
|
||||||
libraryErrorReporter.reportErrorForOffset(
|
libraryErrorReporter.reportErrorForOffset(
|
||||||
ResolverErrorCode.MISSING_LIBRARY_DIRECTIVE_WITH_PART, 0, 0);
|
ResolverErrorCode.MISSING_LIBRARY_DIRECTIVE_WITH_PART, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1422,7 +1422,7 @@ class AnalysisOptionsImpl implements AnalysisOptions {
|
||||||
List<String> _excludePatterns;
|
List<String> _excludePatterns;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool enableUriInPartOf = true;
|
bool enableUriInPartOf = false;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool generateImplicitErrors = true;
|
bool generateImplicitErrors = true;
|
||||||
|
@ -1686,7 +1686,7 @@ class AnalysisOptionsImpl implements AnalysisOptions {
|
||||||
enableStrictCallChecks = false;
|
enableStrictCallChecks = false;
|
||||||
enableSuperMixins = false;
|
enableSuperMixins = false;
|
||||||
enableTiming = false;
|
enableTiming = false;
|
||||||
enableUriInPartOf = true;
|
enableUriInPartOf = false;
|
||||||
_errorProcessors = null;
|
_errorProcessors = null;
|
||||||
_excludePatterns = null;
|
_excludePatterns = null;
|
||||||
finerGrainedInvalidation = false;
|
finerGrainedInvalidation = false;
|
||||||
|
|
|
@ -208,7 +208,7 @@ class Parser {
|
||||||
* A flag indicating whether the parser is to allow URI's in part-of
|
* A flag indicating whether the parser is to allow URI's in part-of
|
||||||
* directives.
|
* directives.
|
||||||
*/
|
*/
|
||||||
bool _enableUriInPartOf = true;
|
bool _enableUriInPartOf = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A flag indicating whether parser is to parse function bodies.
|
* A flag indicating whether parser is to parse function bodies.
|
||||||
|
|
|
@ -1368,7 +1368,7 @@ class _SummarizeAstVisitor extends RecursiveAstVisitor {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void visitPartOfDirective(PartOfDirective node) {
|
void visitPartOfDirective(PartOfDirective node) {
|
||||||
isCoreLibrary = node.libraryName?.name == 'dart.core';
|
isCoreLibrary = node.libraryName.name == 'dart.core';
|
||||||
isPartOf = true;
|
isPartOf = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1626,8 +1626,7 @@ class BuildLibraryElementTask extends SourceBasedAnalysisTask {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (hasPartDirective && libraryNameNode == null &&
|
if (hasPartDirective && libraryNameNode == null) {
|
||||||
!context.analysisOptions.enableUriInPartOf) {
|
|
||||||
errors.add(new AnalysisError(librarySource, 0, 0,
|
errors.add(new AnalysisError(librarySource, 0, 0,
|
||||||
ResolverErrorCode.MISSING_LIBRARY_DIRECTIVE_WITH_PART));
|
ResolverErrorCode.MISSING_LIBRARY_DIRECTIVE_WITH_PART));
|
||||||
}
|
}
|
||||||
|
|
|
@ -3419,8 +3419,7 @@ class Foo {
|
||||||
|
|
||||||
void test_nonIdentifierLibraryName_partOf() {
|
void test_nonIdentifierLibraryName_partOf() {
|
||||||
CompilationUnit unit = parseCompilationUnit(
|
CompilationUnit unit = parseCompilationUnit(
|
||||||
"part of 3;", [ParserErrorCode.MISSING_NAME_IN_PART_OF_DIRECTIVE,
|
"part of 'lib';", [ParserErrorCode.NON_IDENTIFIER_LIBRARY_NAME]);
|
||||||
ParserErrorCode.UNEXPECTED_TOKEN]);
|
|
||||||
expect(unit, isNotNull);
|
expect(unit, isNotNull);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -766,13 +766,8 @@ library lib;
|
||||||
Source partSource = addSource("/part.dart", "part of 'lib';");
|
Source partSource = addSource("/part.dart", "part of 'lib';");
|
||||||
context.parseCompilationUnit(librarySource);
|
context.parseCompilationUnit(librarySource);
|
||||||
List<AnalysisError> errors = context.computeErrors(partSource);
|
List<AnalysisError> errors = context.computeErrors(partSource);
|
||||||
if (context.analysisOptions.enableUriInPartOf) {
|
expect(errors, isNotNull);
|
||||||
// TODO(28522)
|
expect(errors.length > 0, isTrue);
|
||||||
// Should report that 'lib' isn't the correct URI.
|
|
||||||
} else {
|
|
||||||
expect(errors, isNotNull);
|
|
||||||
expect(errors.length > 0, isTrue);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_computeErrors_dart_some() {
|
void test_computeErrors_dart_some() {
|
||||||
|
|
|
@ -414,14 +414,9 @@ part of lib;
|
||||||
|
|
||||||
AnalysisResult libResult = await driver.getResult(lib);
|
AnalysisResult libResult = await driver.getResult(lib);
|
||||||
List<AnalysisError> errors = libResult.errors;
|
List<AnalysisError> errors = libResult.errors;
|
||||||
if (libResult.unit.element.context.analysisOptions.enableUriInPartOf) {
|
expect(errors, hasLength(1));
|
||||||
// TODO(28522): Should cause an error for wrong library name.
|
expect(errors[0].errorCode,
|
||||||
expect(errors, hasLength(0));
|
ResolverErrorCode.MISSING_LIBRARY_DIRECTIVE_WITH_PART);
|
||||||
} else {
|
|
||||||
expect(errors, hasLength(1));
|
|
||||||
expect(errors[0].errorCode,
|
|
||||||
ResolverErrorCode.MISSING_LIBRARY_DIRECTIVE_WITH_PART);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
test_analyze_resolveDirectives_error_partOfDifferentLibrary_byName() async {
|
test_analyze_resolveDirectives_error_partOfDifferentLibrary_byName() async {
|
||||||
|
|
|
@ -870,37 +870,8 @@ part of my_lib;
|
||||||
part of my_lib;
|
part of my_lib;
|
||||||
'''
|
'''
|
||||||
});
|
});
|
||||||
if (context.analysisOptions.enableUriInPartOf) {
|
_assertErrorsWithCodes(
|
||||||
// TODO(28522)
|
[ResolverErrorCode.MISSING_LIBRARY_DIRECTIVE_WITH_PART]);
|
||||||
// Should report that names are wrong.
|
|
||||||
} else {
|
|
||||||
_assertErrorsWithCodes(
|
|
||||||
[ResolverErrorCode.MISSING_LIBRARY_DIRECTIVE_WITH_PART]);
|
|
||||||
AnalysisError error = errorListener.errors[0];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
test_perform_error_missingLibraryDirectiveWithPart_noCommon() {
|
|
||||||
_performBuildTask({
|
|
||||||
'/lib.dart': '''
|
|
||||||
part 'partA.dart';
|
|
||||||
part 'partB.dart';
|
|
||||||
''',
|
|
||||||
'/partA.dart': '''
|
|
||||||
part of libA;
|
|
||||||
''',
|
|
||||||
'/partB.dart': '''
|
|
||||||
part of libB;
|
|
||||||
'''
|
|
||||||
});
|
|
||||||
if (context.analysisOptions.enableUriInPartOf) {
|
|
||||||
// TODO(28522)
|
|
||||||
// Should report that names are wrong.
|
|
||||||
} else {
|
|
||||||
_assertErrorsWithCodes(
|
|
||||||
[ResolverErrorCode.MISSING_LIBRARY_DIRECTIVE_WITH_PART]);
|
|
||||||
AnalysisError error = errorListener.errors[0];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
test_perform_error_partDoesNotExist() {
|
test_perform_error_partDoesNotExist() {
|
||||||
|
|
|
@ -292,7 +292,6 @@ enum MessageKind {
|
||||||
LIBRARY_NOT_FOUND,
|
LIBRARY_NOT_FOUND,
|
||||||
LIBRARY_NOT_SUPPORTED,
|
LIBRARY_NOT_SUPPORTED,
|
||||||
LIBRARY_TAG_MUST_BE_FIRST,
|
LIBRARY_TAG_MUST_BE_FIRST,
|
||||||
LIBRARY_URI_MISMATCH,
|
|
||||||
MAIN_HAS_PART_OF,
|
MAIN_HAS_PART_OF,
|
||||||
MAIN_NOT_A_FUNCTION,
|
MAIN_NOT_A_FUNCTION,
|
||||||
MAIN_WITH_EXTRA_PARAMETER,
|
MAIN_WITH_EXTRA_PARAMETER,
|
||||||
|
@ -2074,26 +2073,6 @@ main() {}
|
||||||
""",
|
""",
|
||||||
'part.dart': """
|
'part.dart': """
|
||||||
part of lib.bar;
|
part of lib.bar;
|
||||||
"""
|
|
||||||
}
|
|
||||||
]),
|
|
||||||
|
|
||||||
MessageKind.LIBRARY_URI_MISMATCH: const MessageTemplate(
|
|
||||||
MessageKind.LIBRARY_URI_MISMATCH,
|
|
||||||
"Expected URI of library '#{libraryUri}'.",
|
|
||||||
howToFix: "Try changing the directive to 'part of "
|
|
||||||
"\"#{libraryUri}\";'.",
|
|
||||||
examples: const [
|
|
||||||
const {
|
|
||||||
'main.dart': """
|
|
||||||
library lib.foo;
|
|
||||||
|
|
||||||
part 'part.dart';
|
|
||||||
|
|
||||||
main() {}
|
|
||||||
""",
|
|
||||||
'part.dart': """
|
|
||||||
part of 'not-main.dart';
|
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
]),
|
]),
|
||||||
|
|
|
@ -767,20 +767,6 @@ class CompilationUnitElementX extends ElementX
|
||||||
}
|
}
|
||||||
partTag = tag;
|
partTag = tag;
|
||||||
LibraryName libraryTag = library.libraryTag;
|
LibraryName libraryTag = library.libraryTag;
|
||||||
|
|
||||||
Expression libraryReference = tag.name;
|
|
||||||
if (libraryReference is LiteralString) {
|
|
||||||
// Name is a URI. Resolve and compare to library's URI.
|
|
||||||
String content = libraryReference.dartString.slowToString();
|
|
||||||
Uri uri = this.script.readableUri.resolve(content);
|
|
||||||
Uri expectedUri = library.canonicalUri;
|
|
||||||
if (uri != expectedUri) {
|
|
||||||
// Consider finding a relative URI reference for the error message.
|
|
||||||
reporter.reportWarningMessage(tag.name,
|
|
||||||
MessageKind.LIBRARY_URI_MISMATCH, {'libraryUri': expectedUri});
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
String actualName = tag.name.toString();
|
String actualName = tag.name.toString();
|
||||||
if (libraryTag != null) {
|
if (libraryTag != null) {
|
||||||
String expectedName = libraryTag.name.toString();
|
String expectedName = libraryTag.name.toString();
|
||||||
|
|
|
@ -344,13 +344,8 @@ class Parser {
|
||||||
assert(optional('part', token));
|
assert(optional('part', token));
|
||||||
assert(optional('of', token.next));
|
assert(optional('of', token.next));
|
||||||
Token partKeyword = token;
|
Token partKeyword = token;
|
||||||
token = token.next.next;
|
token = parseQualified(token.next.next, IdentifierContext.partName,
|
||||||
if (token.isIdentifier()) {
|
IdentifierContext.partNameContinuation);
|
||||||
token = parseQualified(token, IdentifierContext.partName,
|
|
||||||
IdentifierContext.partNameContinuation);
|
|
||||||
} else {
|
|
||||||
token = parseLiteralStringOrRecoverExpression(token);
|
|
||||||
}
|
|
||||||
Token semicolon = token;
|
Token semicolon = token;
|
||||||
token = expect(';', token);
|
token = expect(';', token);
|
||||||
listener.endPartOf(partKeyword, semicolon);
|
listener.endPartOf(partKeyword, semicolon);
|
||||||
|
|
|
@ -6386,16 +6386,12 @@ void Parser::ParsePartHeader() {
|
||||||
ReportError("'part of' expected");
|
ReportError("'part of' expected");
|
||||||
}
|
}
|
||||||
ConsumeToken();
|
ConsumeToken();
|
||||||
// The VM is not required to check that the library name or URI matches the
|
// The VM is not required to check that the library name matches the
|
||||||
// name or URI of the current library, so we ignore them.
|
// name of the current library, so we ignore it.
|
||||||
if (CurrentToken() == Token::kSTRING) {
|
ExpectIdentifier("library name expected");
|
||||||
ParseStringLiteral(false);
|
while (CurrentToken() == Token::kPERIOD) {
|
||||||
} else {
|
ConsumeToken();
|
||||||
ExpectIdentifier("library name expected");
|
ExpectIdentifier("malformed library name");
|
||||||
while (CurrentToken() == Token::kPERIOD) {
|
|
||||||
ConsumeToken();
|
|
||||||
ExpectIdentifier("malformed library name");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
ExpectSemicolon();
|
ExpectSemicolon();
|
||||||
}
|
}
|
||||||
|
|
|
@ -553,15 +553,17 @@ abstract class Future<T> {
|
||||||
* }
|
* }
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
// The `Function` below stands for one of two types:
|
// The `Function` below can stand for several types:
|
||||||
// - (dynamic) -> FutureOr<T>
|
// - (dynamic) -> T
|
||||||
// - (dynamic, StackTrace) -> FutureOr<T>
|
// - (dynamic, StackTrace) -> T
|
||||||
|
// - (dynamic) -> Future<T>
|
||||||
|
// - (dynamic, StackTrace) -> Future<T>
|
||||||
// Given that there is a `test` function that is usually used to do an
|
// Given that there is a `test` function that is usually used to do an
|
||||||
// `isCheck` we should also expect functions that take a specific argument.
|
// `isCheck` we should also expect functions that take a specific argument.
|
||||||
// Note: making `catchError` return a `Future<T>` in non-strong mode could be
|
// Note: making `catchError` return a `Future<T>` in non-strong mode could be
|
||||||
// a breaking change.
|
// a breaking change.
|
||||||
Future<T> catchError(Function onError,
|
Future<T> catchError(Function onError,
|
||||||
{bool test(Object error)});
|
{bool test(Object error)});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register a function to be called when this future completes.
|
* Register a function to be called when this future completes.
|
||||||
|
@ -783,7 +785,7 @@ abstract class Completer<T> {
|
||||||
*
|
*
|
||||||
* All listeners on the future are informed about the value.
|
* All listeners on the future are informed about the value.
|
||||||
*/
|
*/
|
||||||
void complete([FutureOr<T> value]);
|
void complete([value]);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Complete [future] with an error.
|
* Complete [future] with an error.
|
||||||
|
@ -825,4 +827,5 @@ void _completeWithErrorCallback(_Future result, error, stackTrace) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Helper function that converts `null` to a [NullThrownError]. */
|
/** Helper function that converts `null` to a [NullThrownError]. */
|
||||||
Object _nonNullError(Object error) => error ?? new NullThrownError();
|
Object _nonNullError(Object error) =>
|
||||||
|
(error != null) ? error : new NullThrownError();
|
||||||
|
|
|
@ -14,7 +14,7 @@ typedef _FutureAction();
|
||||||
abstract class _Completer<T> implements Completer<T> {
|
abstract class _Completer<T> implements Completer<T> {
|
||||||
final _Future<T> future = new _Future<T>();
|
final _Future<T> future = new _Future<T>();
|
||||||
|
|
||||||
void complete([FutureOr<T> value]);
|
void complete([value]);
|
||||||
|
|
||||||
void completeError(Object error, [StackTrace stackTrace]) {
|
void completeError(Object error, [StackTrace stackTrace]) {
|
||||||
error = _nonNullError(error);
|
error = _nonNullError(error);
|
||||||
|
@ -36,7 +36,7 @@ abstract class _Completer<T> implements Completer<T> {
|
||||||
|
|
||||||
class _AsyncCompleter<T> extends _Completer<T> {
|
class _AsyncCompleter<T> extends _Completer<T> {
|
||||||
|
|
||||||
void complete([FutureOr<T> value]) {
|
void complete([value]) {
|
||||||
if (!future._mayComplete) throw new StateError("Future already completed");
|
if (!future._mayComplete) throw new StateError("Future already completed");
|
||||||
future._asyncComplete(value);
|
future._asyncComplete(value);
|
||||||
}
|
}
|
||||||
|
@ -47,7 +47,7 @@ class _AsyncCompleter<T> extends _Completer<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
class _SyncCompleter<T> extends _Completer<T> {
|
class _SyncCompleter<T> extends _Completer<T> {
|
||||||
void complete([FutureOr<T> value]) {
|
void complete([value]) {
|
||||||
if (!future._mayComplete) throw new StateError("Future already completed");
|
if (!future._mayComplete) throw new StateError("Future already completed");
|
||||||
future._complete(value);
|
future._complete(value);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
|
|
||||||
// for details. All rights reserved. Use of this source code is governed by a
|
|
||||||
// BSD-style license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
part of "part_of_uri2_test.dart";
|
|
||||||
|
|
||||||
// Refer to declaration in library and other part.
|
|
||||||
const bar1 = "part1";
|
|
||||||
const baz1 = "$foo${bar2}1";
|
|
|
@ -1,9 +0,0 @@
|
||||||
// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
|
|
||||||
// for details. All rights reserved. Use of this source code is governed by a
|
|
||||||
// BSD-style license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
part of part_of_uri2;
|
|
||||||
|
|
||||||
// Refer to declaration in library and other part.
|
|
||||||
const bar2 = "part2";
|
|
||||||
const baz2 = "$foo${bar1}2";
|
|
|
@ -1,15 +0,0 @@
|
||||||
// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
|
|
||||||
// for details. All rights reserved. Use of this source code is governed by a
|
|
||||||
// BSD-style license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
library part_of_uri2;
|
|
||||||
|
|
||||||
part "part_of_uri2_part.dart"; // declares bar1, baz1, uses URI.
|
|
||||||
part "part_of_uri2_part2.dart"; // declares bar2, baz2, uses id.
|
|
||||||
|
|
||||||
const foo = 'foo';
|
|
||||||
const qux = "$baz1$baz2";
|
|
||||||
|
|
||||||
main() {
|
|
||||||
if (!identical(qux, "foopart21foopart12")) throw "Fail: $qux";
|
|
||||||
}
|
|
|
@ -1,9 +0,0 @@
|
||||||
// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
|
|
||||||
// for details. All rights reserved. Use of this source code is governed by a
|
|
||||||
// BSD-style license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
part of "part_of_uri_test.dart";
|
|
||||||
|
|
||||||
// Refer to declaration in library and other part.
|
|
||||||
const bar1 = "part1";
|
|
||||||
const baz1 = "$foo${bar2}1";
|
|
|
@ -1,9 +0,0 @@
|
||||||
// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
|
|
||||||
// for details. All rights reserved. Use of this source code is governed by a
|
|
||||||
// BSD-style license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
part of "part_of_uri_test.dart";
|
|
||||||
|
|
||||||
// Refer to declaration in library and other part.
|
|
||||||
const bar2 = "part2";
|
|
||||||
const baz2 = "$foo${bar1}2";
|
|
|
@ -1,14 +0,0 @@
|
||||||
// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
|
|
||||||
// for details. All rights reserved. Use of this source code is governed by a
|
|
||||||
// BSD-style license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// No library declaration
|
|
||||||
part "part_of_uri_part.dart"; // declares bar1, baz1
|
|
||||||
part "part_of_uri_part2.dart"; // declares bar2, baz2
|
|
||||||
|
|
||||||
const foo = 'foo';
|
|
||||||
const qux = "$baz1$baz2";
|
|
||||||
|
|
||||||
main() {
|
|
||||||
if (!identical(qux, "foopart21foopart12")) throw "Fail: $qux";
|
|
||||||
}
|
|
Loading…
Reference in a new issue