| // Copyright (c) 2012, 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. |
| |
| import 'dart:async'; |
| |
| import 'package:async_helper/async_helper.dart'; |
| import 'package:compiler/src/diagnostics/messages.dart' show MessageKind; |
| import 'package:compiler/src/io/source_file.dart'; |
| import 'package:compiler/src/old_to_new_api.dart'; |
| |
| import 'mock_compiler.dart'; |
| |
| const String PRIVATE_SOURCE_URI = 'src:private'; |
| const String PRIVATE_SOURCE = ''' |
| |
| var _privateVariable; |
| void _privateFunction() {} |
| |
| class _PrivateClass { |
| _PrivateClass(); |
| _PrivateClass.publicConstructor(); |
| _PrivateClass._privateConstructor(); |
| |
| var _privateField; |
| get _privateGetter => null; |
| void set _privateSetter(var value) {} |
| void _privateMethod() {} |
| |
| var publicField; |
| get publicGetter => null; |
| void set publicSetter(var value) {} |
| void publicMethod() {} |
| } |
| |
| class PublicClass extends _PrivateClass { |
| PublicClass() : super(); |
| PublicClass.publicConstructor() : super.publicConstructor(); |
| PublicClass._privateConstructor() : super._privateConstructor(); |
| |
| _PrivateClass get private => this; |
| } |
| '''; |
| |
| analyze(String text, [expectedWarnings]) { |
| return () { |
| if (expectedWarnings == null) expectedWarnings = []; |
| if (expectedWarnings is! List) expectedWarnings = [expectedWarnings]; |
| |
| MockCompiler compiler = new MockCompiler.internal(analyzeOnly: true); |
| compiler.registerSource(Uri.parse(PRIVATE_SOURCE_URI), PRIVATE_SOURCE); |
| compiler.diagnosticHandler = new LegacyCompilerDiagnostics( |
| (uri, int begin, int end, String message, kind) { |
| SourceFile sourceFile = compiler.sourceFiles[uri.toString()]; |
| if (sourceFile != null) { |
| print(sourceFile.getLocationMessage(message, begin, end)); |
| } else { |
| print(message); |
| } |
| }); |
| |
| String source = ''' |
| library public; |
| |
| import '$PRIVATE_SOURCE_URI'; |
| |
| void main() { |
| PublicClass publicClass; |
| $text |
| } |
| '''; |
| Uri uri = Uri.parse('src:public'); |
| compiler.registerSource(uri, source); |
| return compiler.run(uri).then((_) { |
| DiagnosticCollector collector = compiler.diagnosticCollector; |
| compareWarningKinds(text, expectedWarnings, collector.warnings); |
| }); |
| }; |
| } |
| |
| void main() { |
| asyncTest(() => Future.forEach([ |
| // Read from private variable. |
| analyze('var value = _privateVariable;', MessageKind.CANNOT_RESOLVE), |
| // Write to private variable. |
| analyze('_privateVariable = 0;', MessageKind.CANNOT_RESOLVE), |
| // Access private function. |
| analyze('var value = _privateFunction;', MessageKind.CANNOT_RESOLVE), |
| // Call private function. |
| analyze('_privateFunction();', MessageKind.CANNOT_RESOLVE), |
| |
| // Call unnamed (public) constructor on private class. |
| analyze('new _PrivateClass();', MessageKind.CANNOT_RESOLVE), |
| // Call public constructor on private class. |
| analyze('new _PrivateClass.publicConstructor();', |
| MessageKind.CANNOT_RESOLVE), |
| // Call private constructor on private class. |
| analyze('new _PrivateClass._privateConstructor();', |
| MessageKind.CANNOT_RESOLVE), |
| // Call public getter of private type. |
| analyze('var value = publicClass.private;'), |
| // Read from private field on private class. |
| analyze('var value = publicClass.private._privateField;', |
| MessageKind.PRIVATE_ACCESS), |
| // Write to private field on private class. |
| analyze('publicClass.private._privateField = 0;', |
| MessageKind.PRIVATE_ACCESS), |
| // Call private getter on private class. |
| analyze('var value = publicClass.private._privateGetter;', |
| MessageKind.PRIVATE_ACCESS), |
| // Call private setter on private class. |
| analyze('publicClass.private._privateSetter = 0;', |
| MessageKind.PRIVATE_ACCESS), |
| // Access private method on private class. |
| analyze('var value = publicClass.private._privateMethod;', |
| MessageKind.PRIVATE_ACCESS), |
| // Call private method on private class. |
| analyze('publicClass.private._privateMethod();', |
| MessageKind.PRIVATE_ACCESS), |
| |
| // Read from public field on private class. |
| analyze('var value = publicClass.private.publicField;'), |
| // Write to public field on private class. |
| analyze('publicClass.private.publicField = 0;'), |
| // Call public getter on private class. |
| analyze('var value = publicClass.private.publicGetter;'), |
| // Call public setter on private class. |
| analyze('publicClass.private.publicSetter = 0;'), |
| // Access public method on private class. |
| analyze('var value = publicClass.private.publicMethod;'), |
| // Call public method on private class. |
| analyze('publicClass.private.publicMethod();'), |
| |
| // Call unnamed (public) constructor on public class. |
| analyze('publicClass = new PublicClass();'), |
| // Call public constructor on public class. |
| analyze('publicClass = new PublicClass.publicConstructor();'), |
| // Call private constructor on public class. |
| analyze('publicClass = new PublicClass._privateConstructor();', |
| MessageKind.CANNOT_FIND_CONSTRUCTOR), |
| // Read from private field on public class. |
| analyze('var value = publicClass._privateField;', |
| MessageKind.PRIVATE_ACCESS), |
| // Write to private field on public class. |
| analyze('publicClass._privateField = 0;', MessageKind.PRIVATE_ACCESS), |
| // Call private getter on public class. |
| analyze('var value = publicClass._privateGetter;', |
| MessageKind.PRIVATE_ACCESS), |
| // Call private setter on public class. |
| analyze('publicClass._privateSetter = 0;', MessageKind.PRIVATE_ACCESS), |
| // Access private method on public class. |
| analyze('var value = publicClass._privateMethod;', |
| MessageKind.PRIVATE_ACCESS), |
| // Call private method on public class. |
| analyze('publicClass._privateMethod();', MessageKind.PRIVATE_ACCESS), |
| |
| // Read from public field on public class. |
| analyze('var value = publicClass.publicField;'), |
| // Write to public field on public class. |
| analyze('publicClass.publicField = 0;'), |
| // Call public getter on public class. |
| analyze('var value = publicClass.publicGetter;'), |
| // Call public setter on public class. |
| analyze('publicClass.publicSetter = 0;'), |
| // Access public method on public class. |
| analyze('var value = publicClass.publicMethod;'), |
| // Call public method on public class. |
| analyze('publicClass.publicMethod();'), |
| ], (f) => f())); |
| } |