| Index: pkg/analysis_server/tool/spec/codegen_java.dart
|
| diff --git a/pkg/analysis_server/tool/spec/codegen_java.dart b/pkg/analysis_server/tool/spec/codegen_java.dart
|
| index bec7dd64eb1099ff228398389326b398dcc5bdb4..a8d92002b4ae69e3630208d6987c60560d53c023 100644
|
| --- a/pkg/analysis_server/tool/spec/codegen_java.dart
|
| +++ b/pkg/analysis_server/tool/spec/codegen_java.dart
|
| @@ -8,17 +8,37 @@
|
| library CodegenJava;
|
|
|
| import 'package:html5lib/dom.dart' as dom;
|
| +
|
| import 'api.dart';
|
| import 'codegen_tools.dart';
|
| import 'from_html.dart';
|
| import 'to_html.dart';
|
|
|
| /**
|
| + * Create a [GeneratedFile] that creates Java code and outputs it to [path].
|
| + * [path] uses Posix-style path separators regardless of the OS.
|
| + */
|
| +GeneratedFile javaGeneratedFile(String path, CodegenJavaVisitor
|
| + createVisitor(Api api)) {
|
| + return new GeneratedFile(path, () {
|
| + CodegenJavaVisitor visitor = createVisitor(readApi());
|
| + return visitor.collectCode(visitor.visitApi);
|
| + });
|
| +}
|
| +
|
| +/**
|
| + * Iterate through the values in [map] in the order of increasing keys.
|
| + */
|
| +Iterable<String> _valuesSortedByKey(Map<String, String> map) {
|
| + List<String> keys = map.keys.toList();
|
| + keys.sort();
|
| + return keys.map((String key) => map[key]);
|
| +}
|
| +
|
| +/**
|
| * Common code for all Java code generation.
|
| */
|
| class CodegenJavaVisitor extends HierarchicalApiVisitor with CodeGenerator {
|
| - _CodegenJavaState _state;
|
| -
|
| /**
|
| * Variable names which must be changed in order to avoid conflict with
|
| * reserved words in Java.
|
| @@ -40,6 +60,8 @@ class CodegenJavaVisitor extends HierarchicalApiVisitor with CodeGenerator {
|
| 'Override': 'OverrideMember',
|
| };
|
|
|
| + _CodegenJavaState _state;
|
| +
|
| /**
|
| * Visitor used to produce doc comments.
|
| */
|
| @@ -50,89 +72,71 @@ class CodegenJavaVisitor extends HierarchicalApiVisitor with CodeGenerator {
|
| toHtmlVisitor = new ToHtmlVisitor(api);
|
|
|
| /**
|
| - * Convenience method for subclasses for calling docComment.
|
| + * Create a constructor, using [callback] to create its contents.
|
| */
|
| - void javadocComment(List<dom.Node> docs) {
|
| - docComment(docs, width: 99, javadocStyle: true);
|
| + void constructor(String name, void callback()) {
|
| + _state.constructors[name] = collectCode(callback);
|
| }
|
|
|
| /**
|
| - * Create a public field, using [callback] to create its contents.
|
| + * Return true iff the passed [TypeDecl] will represent an array in Java.
|
| */
|
| - void publicField(String fieldName, void callback()) {
|
| - _state.publicFields[fieldName] = collectCode(callback);
|
| + bool isArray(TypeDecl type) {
|
| + return type is TypeList && isPrimitive(type.itemType);
|
| }
|
|
|
| /**
|
| - * Create a private field, using [callback] to create its contents.
|
| + * Return true iff the passed [TypeDecl] is a type declared in the spec_input.
|
| */
|
| - void privateField(String fieldName, void callback()) {
|
| - _state.privateFields[fieldName] = collectCode(callback);
|
| + bool isDeclaredInSpec(TypeDecl type) {
|
| +// TypeReference resolvedType = super.resolveTypeReferenceChain(type);
|
| +// if(resolvedType is TypeObject) {
|
| +// return truye;
|
| +// }
|
| + if (type is TypeReference) {
|
| + return api.types.containsKey(type.typeName) && javaType(type) != 'String';
|
| + }
|
| + return false;
|
| }
|
|
|
| /**
|
| - * Create a constructor, using [callback] to create its contents.
|
| + * Return true iff the passed [TypeDecl] will represent an array in Java.
|
| */
|
| - void constructor(String name, void callback()) {
|
| - _state.constructors[name] = collectCode(callback);
|
| + bool isList(TypeDecl type) {
|
| + return type is TypeList && !isPrimitive(type.itemType);
|
| }
|
|
|
| /**
|
| - * Create a private method, using [callback] to create its contents.
|
| + * Return true iff the passed [TypeDecl] will represent a Map in type.
|
| */
|
| - void privateMethod(String methodName, void callback()) {
|
| - _state.privateMethods[methodName] = collectCode(callback);
|
| + bool isMap(TypeDecl type) {
|
| + return type is TypeMap;
|
| }
|
|
|
| /**
|
| - * Create a public method, using [callback] to create its contents.
|
| + * Return true iff the passed [TypeDecl] will be represented as Object in Java.
|
| */
|
| - void publicMethod(String methodName, void callback()) {
|
| - _state.publicMethods[methodName] = collectCode(callback);
|
| + bool isObject(TypeDecl type) {
|
| + String typeStr = javaType(type);
|
| + return typeStr == 'Object';
|
| }
|
|
|
| /**
|
| - * Execute [callback], collecting any methods that are output using
|
| - * [privateMethod] or [publicMethod], and insert the class (with methods
|
| - * sorted). [header] is the part of the class declaration before the
|
| - * opening brace.
|
| + * Return true iff the passed [TypeDecl] will represent a primitive Java type.
|
| */
|
| - void makeClass(String header, void callback()) {
|
| - _CodegenJavaState oldState = _state;
|
| - try {
|
| - _state = new _CodegenJavaState();
|
| - callback();
|
| - writeln('$header {');
|
| - indent(() {
|
| - // fields
|
| - List<String> allFields = _state.publicFields.values.toList();
|
| - allFields.addAll(_state.privateFields.values.toList());
|
| - for (String field in allFields) {
|
| - writeln();
|
| - write(field);
|
| - }
|
| -
|
| - // constructors
|
| - List<String> allConstructors = _state.constructors.values.toList();
|
| - for (String constructor in allConstructors) {
|
| - writeln();
|
| - write(constructor);
|
| - }
|
| -
|
| - // methods (ordered by method name)
|
| - List<String> allMethods =
|
| - _valuesSortedByKey(_state.publicMethods).toList();
|
| - allMethods.addAll(_valuesSortedByKey(_state.privateMethods));
|
| - for (String method in allMethods) {
|
| - writeln();
|
| - write(method);
|
| - }
|
| - writeln();
|
| - });
|
| - writeln('}');
|
| - } finally {
|
| - _state = oldState;
|
| + bool isPrimitive(TypeDecl type) {
|
| + if (type is TypeReference) {
|
| + String typeStr = javaType(type);
|
| + return typeStr == 'boolean' || typeStr == 'int' || typeStr == 'long';
|
| }
|
| + return false;
|
| + }
|
| +
|
| + /**
|
| + * Convenience method for subclasses for calling docComment.
|
| + */
|
| + void javadocComment(List<dom.Node> docs) {
|
| + docComment(docs, width: 99, javadocStyle: true);
|
| }
|
|
|
| /**
|
| @@ -143,6 +147,16 @@ class CodegenJavaVisitor extends HierarchicalApiVisitor with CodeGenerator {
|
| }
|
|
|
| /**
|
| + * Return a suitable representation of [name] as the name of a Java variable.
|
| + */
|
| + String javaName(String name) {
|
| + if (_variableRenames.containsKey(name)) {
|
| + return _variableRenames[name];
|
| + }
|
| + return name;
|
| + }
|
| +
|
| + /**
|
| * Convert the given [TypeDecl] to a Java type.
|
| */
|
| String javaType(TypeDecl type, [bool optional = false]) {
|
| @@ -176,67 +190,75 @@ class CodegenJavaVisitor extends HierarchicalApiVisitor with CodeGenerator {
|
| }
|
|
|
| /**
|
| - * Return true iff the passed [TypeDecl] will represent a primitive Java type.
|
| + * Execute [callback], collecting any methods that are output using
|
| + * [privateMethod] or [publicMethod], and insert the class (with methods
|
| + * sorted). [header] is the part of the class declaration before the
|
| + * opening brace.
|
| */
|
| - bool isPrimitive(TypeDecl type) {
|
| - if (type is TypeReference) {
|
| - String typeStr = javaType(type);
|
| - return typeStr == 'boolean' || typeStr == 'int' || typeStr == 'long';
|
| - }
|
| - return false;
|
| - }
|
| + void makeClass(String header, void callback()) {
|
| + _CodegenJavaState oldState = _state;
|
| + try {
|
| + _state = new _CodegenJavaState();
|
| + callback();
|
| + writeln('$header {');
|
| + indent(() {
|
| + // fields
|
| + List<String> allFields = _state.publicFields.values.toList();
|
| + allFields.addAll(_state.privateFields.values.toList());
|
| + for (String field in allFields) {
|
| + writeln();
|
| + write(field);
|
| + }
|
|
|
| - /**
|
| - * Return true iff the passed [TypeDecl] is a type declared in the spec_input.
|
| - */
|
| - bool isDeclaredInSpec(TypeDecl type) {
|
| -// TypeReference resolvedType = super.resolveTypeReferenceChain(type);
|
| -// if(resolvedType is TypeObject) {
|
| -// return truye;
|
| -// }
|
| - if (type is TypeReference) {
|
| - return api.types.containsKey(type.typeName) && javaType(type) != 'String';
|
| - }
|
| - return false;
|
| - }
|
| + // constructors
|
| + List<String> allConstructors = _state.constructors.values.toList();
|
| + for (String constructor in allConstructors) {
|
| + writeln();
|
| + write(constructor);
|
| + }
|
|
|
| - /**
|
| - * Return true iff the passed [TypeDecl] will be represented as Object in Java.
|
| - */
|
| - bool isObject(TypeDecl type) {
|
| - String typeStr = javaType(type);
|
| - return typeStr == 'Object';
|
| + // methods (ordered by method name)
|
| + List<String> allMethods =
|
| + _valuesSortedByKey(_state.publicMethods).toList();
|
| + allMethods.addAll(_valuesSortedByKey(_state.privateMethods));
|
| + for (String method in allMethods) {
|
| + writeln();
|
| + write(method);
|
| + }
|
| + writeln();
|
| + });
|
| + writeln('}');
|
| + } finally {
|
| + _state = oldState;
|
| + }
|
| }
|
|
|
| /**
|
| - * Return true iff the passed [TypeDecl] will represent an array in Java.
|
| + * Create a private field, using [callback] to create its contents.
|
| */
|
| - bool isList(TypeDecl type) {
|
| - return type is TypeList && !isPrimitive(type.itemType);
|
| + void privateField(String fieldName, void callback()) {
|
| + _state.privateFields[fieldName] = collectCode(callback);
|
| }
|
|
|
| /**
|
| - * Return true iff the passed [TypeDecl] will represent an array in Java.
|
| + * Create a private method, using [callback] to create its contents.
|
| */
|
| - bool isArray(TypeDecl type) {
|
| - return type is TypeList && isPrimitive(type.itemType);
|
| + void privateMethod(String methodName, void callback()) {
|
| + _state.privateMethods[methodName] = collectCode(callback);
|
| }
|
|
|
| /**
|
| - * Return true iff the passed [TypeDecl] will represent a Map in type.
|
| + * Create a public field, using [callback] to create its contents.
|
| */
|
| - bool isMap(TypeDecl type) {
|
| - return type is TypeMap;
|
| + void publicField(String fieldName, void callback()) {
|
| + _state.publicFields[fieldName] = collectCode(callback);
|
| }
|
|
|
| /**
|
| - * Return a suitable representation of [name] as the name of a Java variable.
|
| + * Create a public method, using [callback] to create its contents.
|
| */
|
| - String javaName(String name) {
|
| - if (_variableRenames.containsKey(name)) {
|
| - return _variableRenames[name];
|
| - }
|
| - return name;
|
| + void publicMethod(String methodName, void callback()) {
|
| + _state.publicMethods[methodName] = collectCode(callback);
|
| }
|
|
|
| @override
|
| @@ -250,15 +272,6 @@ class CodegenJavaVisitor extends HierarchicalApiVisitor with CodeGenerator {
|
| }
|
|
|
| /**
|
| - * Iterate through the values in [map] in the order of increasing keys.
|
| - */
|
| -Iterable<String> _valuesSortedByKey(Map<String, String> map) {
|
| - List<String> keys = map.keys.toList();
|
| - keys.sort();
|
| - return keys.map((String key) => map[key]);
|
| -}
|
| -
|
| -/**
|
| * State used by [CodegenJavaVisitor].
|
| */
|
| class _CodegenJavaState {
|
| @@ -287,15 +300,3 @@ class _CodegenJavaState {
|
| */
|
| Map<String, String> constructors = <String, String>{};
|
| }
|
| -
|
| -/**
|
| - * Create a [GeneratedFile] that creates Java code and outputs it to [path].
|
| - * [path] uses Posix-style path separators regardless of the OS.
|
| - */
|
| -GeneratedFile javaGeneratedFile(String path, CodegenJavaVisitor
|
| - createVisitor(Api api)) {
|
| - return new GeneratedFile(path, () {
|
| - CodegenJavaVisitor visitor = createVisitor(readApi());
|
| - return visitor.collectCode(visitor.visitApi);
|
| - });
|
| -}
|
|
|