import {DocComment} from ast; // == Compilation units == struct JavaCompilationUnit { field packageName: JavaPackageName; field typeDeclaration: JavaTypeDeclaration; } // == Type declarations == sum JavaTypeDeclaration { variant JavaClassDeclaration; variant JavaEnumDeclaration; variant JavaInterfaceDeclaration; variant JavaRecordDeclaration; field name: JavaIdentifier; field customArea: JavaCustomArea; } struct JavaClassDeclaration { field name: JavaIdentifier; field implementsTypes: List[JavaTypeRef]; field body: List[JavaClassBodyDeclaration]; field customArea: JavaCustomArea; field docComment: DocComment; } struct JavaEnumDeclaration { field name: JavaIdentifier; field constants: List[JavaEnumConstant]; field customArea: JavaCustomArea; field docComment: DocComment; } struct JavaEnumConstant { field name: JavaIdentifier; } struct JavaInterfaceDeclaration { field name: JavaIdentifier; field openness: JavaInterfaceOpenness; field permitsTypes: List[JavaTypeRef]; field body: List[JavaClassBodyDeclaration]; field customArea: JavaCustomArea; field docComment: DocComment; } enum JavaInterfaceOpenness { variant open; variant sealed; } struct JavaRecordComponent { field type: JavaTypeRef; field name: JavaIdentifier; } struct JavaRecordDeclaration { field name: JavaIdentifier; field components: List[JavaRecordComponent]; field implementsTypes: List[JavaTypeRef]; field body: List[JavaClassBodyDeclaration]; field customArea: JavaCustomArea; field docComment: DocComment; } // == Type declaration bodies == // TODO: allow JavaClassBodyDeclaration to extend JavaTypeDeclaration sum JavaClassBodyDeclaration { variant JavaClassDeclaration; variant JavaConstructorDeclaration; variant JavaFieldDeclaration; variant JavaInterfaceDeclaration; variant JavaMethodDeclaration; variant JavaRecordDeclaration; } struct JavaConstructorDeclaration { field typeName: JavaIdentifier; field visibility: JavaVisibility; field params: List[JavaParam]; field body: JavaBlock; } struct JavaFieldDeclaration { field visibility: JavaVisibility; field type: JavaTypeRef; field name: JavaIdentifier; } struct JavaMethodDeclaration { field name: JavaIdentifier; field visibility: JavaVisibility; field kind: JavaMethodKind; field returnType: JavaTypeRef; field params: List[JavaParam]; field body: Option[JavaBlock]; } // == Methods == enum JavaMethodKind { variant static; variant instance; } struct JavaParam { field type: JavaTypeRef; field name: JavaIdentifier; } // == Type references == native JavaTypeRef { } // == Visibility == enum JavaVisibility { variant public; variant private; } // == Statements == struct JavaBlock { field statements: List[JavaBlockStatement]; } sum JavaBlockStatement { variant JavaExpressionStatement; variant JavaReturn; } struct JavaExpressionStatement { field expression: JavaExpression; } struct JavaReturn { field value: JavaExpression; } // == Expressions == sum JavaExpression { variant JavaAssignment; variant JavaFieldAccess; variant JavaIntegerLiteral; variant JavaMethodCall; variant JavaMethodRef; variant JavaNewExpression; variant JavaNullLiteral; variant JavaRef; variant JavaStaticFieldAccess; variant JavaStaticMethodCall; variant JavaStringLiteral; } struct JavaAssignment { field left: JavaExpression; field right: JavaExpression; } struct JavaFieldAccess { field receiver: JavaExpression; field fieldName: JavaIdentifier; } struct JavaIntegerLiteral { field value: Int64; } struct JavaMethodCall { field receiver: JavaExpression; field methodName: JavaIdentifier; field args: List[JavaExpression]; } struct JavaMethodRef { field type: JavaTypeRef; field methodName: JavaIdentifier; } struct JavaNewExpression { field type: JavaTypeRef; field args: List[JavaExpression]; } struct JavaNullLiteral { } struct JavaRef { field name: JavaIdentifier; } struct JavaStaticFieldAccess { field type: JavaTypeRef; field fieldName: JavaIdentifier; } struct JavaStaticMethodCall { field type: JavaTypeRef; field methodName: JavaIdentifier; field args: List[JavaExpression]; } struct JavaStringLiteral { field value: String; } // == Identifiers == struct JavaIdentifier { field value: String; } struct JavaPackageName { field parts: List[JavaIdentifier]; } // == Custom areas == struct JavaCustomArea { field type: JavaTypeRef; field name: String; }