public SrcAnnotationExpression copy() { SrcAnnotationExpression copy = new SrcAnnotationExpression( _fqn ); for( SrcArgument expr : _arguments ) { copy.addArgument( expr.copy() ); } return copy; }
private void addTypeReferenceAnnotation( StringBuilder sb, int indent, JsonSchemaType type ) { SrcAnnotationExpression annotation = new SrcAnnotationExpression( TypeReference.class.getName() ) .addArgument( "value", String.class, getPropertyType( type ) ); annotation.render( sb, indent ); }
private void addExtensionAnnotation( SrcAnnotationExpression anno, SrcClass extendedType ) { if( anno.getAnnotationType().equals( Extension.class.getName() ) ) { return; } if( extendedType.getAnnotations().stream().noneMatch( e -> e.getAnnotationType().equals( anno.getAnnotationType() ) ) ) { extendedType.addAnnotation( anno.copy() ); } }
public String makeSource( String extensionClassFqn, DiagnosticListener<JavaFileObject> errorHandler ) .addAnnotation( new SrcAnnotationExpression( Extension.class ) ) .modifiers( Modifier.PUBLIC ); int i = 0; .addParam( new SrcParameter( "thiz", deriveExtendedClassFrom( extensionClassFqn ) ) .addAnnotation( new SrcAnnotationExpression( This.class ) ) ) .returns( String.class ) .body( new SrcStatementBlock()
protected void renderAnnotations( StringBuilder sb, int indent, boolean sameLine ) { for( SrcAnnotationExpression anno : _annotations ) { anno.render( sb, indent, sameLine ); } }
public SrcAnnotationExpression getAnnotation( Class<? extends Annotation> annoClass ) { for( SrcAnnotationExpression anno: getAnnotations() ) { if( anno.getAnnotationType().equals( annoClass.getName() ) ) { return anno; } } return null; }
private boolean warnIfDuplicate( AbstractSrcMethod method, SrcClass extendedType, DiagnosticListener<JavaFileObject> errorHandler ) { AbstractSrcMethod duplicate = findMethod( method, extendedType ); if( duplicate == null ) { return false; } ClassSymbols classSymbols = ClassSymbols.instance( getModule() ); Context ctx = JavacPlugin.instance() == null ? classSymbols.getJavacTask_PlainFileMgr().getContext() : JavacPlugin.instance().getContext(); Symbol.ClassSymbol sym = IDynamicJdk.instance().getLoadedClass( ctx, ((SrcClass)method.getOwner()).getName() ); if( sym == null ) { return false; } JavaFileObject file = sym.sourcefile; SrcAnnotationExpression anno = duplicate.getAnnotation( ExtensionMethod.class ); if( anno != null ) { errorHandler.report( new JavacDiagnostic( file.toUri().getScheme() == null ? null : new SourceJavaFileObject( file.toUri() ), Diagnostic.Kind.WARNING, 0, 0, 0, ExtIssueMsg.MSG_EXTENSION_DUPLICATION.get( method.signature(), ((SrcClass)method.getOwner()).getName(), anno.getArgument( ExtensionMethod.extensionClass ).getValue()) ) ); } else { errorHandler.report( new JavacDiagnostic( file.toUri().getScheme() == null ? null : new SourceJavaFileObject( file.toUri() ), Diagnostic.Kind.WARNING, 0, 0, 0, ExtIssueMsg.MSG_EXTENSION_SHADOWS.get( method.signature(), ((SrcClass)method.getOwner()).getName(), extendedType.getName()) ) ); } return true; }
public String makeSource( String extensionClassFqn, DiagnosticListener<JavaFileObject> errorHandler ) .addAnnotation( new SrcAnnotationExpression( Extension.class ) ) .modifiers( Modifier.PUBLIC ); int i = 0; .addParam( new SrcParameter( "thiz", deriveExtendedClassFrom( extensionClassFqn ) ) .addAnnotation( new SrcAnnotationExpression( This.class ) ) ) .returns( String.class ) .body( new SrcStatementBlock()
public StringBuilder render( StringBuilder sb, int indent ) { return render( sb, indent, false ); }
public boolean hasAnnotation( String fqn ) { for( SrcAnnotationExpression anno: getAnnotations() ) { if( anno.getAnnotationType().equals( fqn ) ) { return true; } } return false; }
private boolean warnIfDuplicate( AbstractSrcMethod method, SrcClass extendedType, DiagnosticListener<JavaFileObject> errorHandler ) { AbstractSrcMethod duplicate = findMethod( method, extendedType ); if( duplicate == null ) { return false; } ClassSymbols classSymbols = ClassSymbols.instance( getModule() ); Context ctx = JavacPlugin.instance() == null ? classSymbols.getJavacTask_PlainFileMgr().getContext() : JavacPlugin.instance().getContext(); Symbol.ClassSymbol sym = IDynamicJdk.instance().getLoadedClass( ctx, ((SrcClass)method.getOwner()).getName() ); if( sym == null ) { return false; } JavaFileObject file = sym.sourcefile; SrcAnnotationExpression anno = duplicate.getAnnotation( ExtensionMethod.class ); if( anno != null ) { errorHandler.report( new JavacDiagnostic( file.toUri().getScheme() == null ? null : new SourceJavaFileObject( file.toUri() ), Diagnostic.Kind.WARNING, 0, 0, 0, ExtIssueMsg.MSG_EXTENSION_DUPLICATION.get( method.signature(), ((SrcClass)method.getOwner()).getName(), anno.getArgument( ExtensionMethod.extensionClass ).getValue()) ) ); } else { errorHandler.report( new JavacDiagnostic( file.toUri().getScheme() == null ? null : new SourceJavaFileObject( file.toUri() ), Diagnostic.Kind.WARNING, 0, 0, 0, ExtIssueMsg.MSG_EXTENSION_SHADOWS.get( method.signature(), ((SrcClass)method.getOwner()).getName(), extendedType.getName()) ) ); } return true; }
private SrcAnnotationExpression makeSourcePositionAnnotation( Token token ) { int i = getFileIndex( token ); return new SrcAnnotationExpression( SourcePosition.class.getName() ) .addArgument( new SrcArgument( new SrcMemberAccessExpression( ManClassUtil.getShortClassName( _extensionFqn ), FIELD_FILE_URL + i ) ).name( "url" ) ) .addArgument( "feature", String.class, token._value.toString() ) .addArgument( "kind", String.class, "favorite" ) .addArgument( "offset", int.class, token._pos ) .addArgument( "length", int.class, token._value.length() ); }
protected boolean addSourcePositionAnnotation( StringBuilder sb, int indent, String name, Token token ) { SrcAnnotationExpression annotation = new SrcAnnotationExpression( SourcePosition.class.getName() ) .addArgument( new SrcArgument( new SrcMemberAccessExpression( getIdentifier(), FIELD_FILE_URL ) ).name( "url" ) ) .addArgument( "feature", String.class, name ) .addArgument( "offset", int.class, token.getOffset() ) .addArgument( "length", int.class, name.length() ); annotation.render( sb, indent ); return true; }
private void addExtensionAnnotationsToExistingClass( SrcClass srcClass, StringBuilder sb ) { if( srcClass.getAnnotations().isEmpty() ) { return; } StringBuilder sbAnnos = new StringBuilder(); for( SrcAnnotationExpression anno : srcClass.getAnnotations() ) { anno.render( sbAnnos, 0 ).append( '\n' ); } String start = (srcClass.isInterface() ? "interface " : "class ") + srcClass.getSimpleName(); int iStart = sb.indexOf( start ); while( iStart != 0 ) { if( sb.charAt( iStart ) == '\n' ) { break; } iStart--; } if( sb.charAt( iStart ) == '\n' ) { iStart++; } sb.insert( iStart, sbAnnos ); }
private void addExtensionAnnotation( SrcAnnotationExpression anno, SrcClass extendedType ) { if( anno.getAnnotationType().equals( Extension.class.getName() ) ) { return; } if( extendedType.getAnnotations().stream().noneMatch( e -> e.getAnnotationType().equals( anno.getAnnotationType() ) ) ) { extendedType.addAnnotation( anno.copy() ); } }
private SrcAnnotationExpression makeSourcePositionAnnotation( Token token ) { int i = getFileIndex( token ); return new SrcAnnotationExpression( SourcePosition.class.getName() ) .addArgument( new SrcArgument( new SrcMemberAccessExpression( ManClassUtil.getShortClassName( _extensionFqn ), FIELD_FILE_URL + i ) ).name( "url" ) ) .addArgument( "feature", String.class, token._value.toString() ) .addArgument( "kind", String.class, "favorite" ) .addArgument( "offset", int.class, token._pos ) .addArgument( "length", int.class, token._value.length() ); }
private void addExtensionAnnotationsToExistingClass( SrcClass srcClass, StringBuilder sb ) { if( srcClass.getAnnotations().isEmpty() ) { return; } StringBuilder sbAnnos = new StringBuilder(); for( SrcAnnotationExpression anno : srcClass.getAnnotations() ) { anno.render( sbAnnos, 0 ).append( '\n' ); } String start = (srcClass.isInterface() ? "interface " : "class ") + srcClass.getSimpleName(); int iStart = sb.indexOf( start ); while( iStart != 0 ) { if( sb.charAt( iStart ) == '\n' ) { break; } iStart--; } if( sb.charAt( iStart ) == '\n' ) { iStart++; } sb.insert( iStart, sbAnnos ); }
private SrcAnnotationExpression addSourcePositionAnnotation( FqnCacheNode<String> node ) { return new SrcAnnotationExpression( SourcePosition.class.getSimpleName() ) .addArgument( new SrcArgument( new SrcMemberAccessExpression( _fqn, FIELD_FILE_URL ) ).name( "url" ) ) .addArgument( "feature", new SrcType( "String" ), node.getName() ) .addArgument( "offset", int.class, findOffsetOf( node ) ) .addArgument( "length", int.class, node.getName() == null ? 0 : node.getName().length() ); }
private SrcAnnotationExpression addSourcePositionAnnotation( FqnCacheNode<String> node ) { return new SrcAnnotationExpression( SourcePosition.class.getSimpleName() ) .addArgument( new SrcArgument( new SrcMemberAccessExpression( _fqn, FIELD_FILE_URL ) ).name( "url" ) ) .addArgument( "feature", new SrcType( "String" ), node.getName() ) .addArgument( "offset", int.class, findOffsetOf( node ) ) .addArgument( "length", int.class, node.getName() == null ? 0 : node.getName().length() ); }
private void addAnnotation( SrcType srcType, Attribute.TypeCompound attr ) { String fqn = attr.type.toString(); if( fqn.equals( "jdk.internal.HotSpotIntrinsicCandidate" ) ) { // Since java 10 we have to keep these out of stubbed java source return; } SrcAnnotationExpression annoExpr = new SrcAnnotationExpression( fqn ); for( Pair<Symbol.MethodSymbol, Attribute> value: attr.values ) { annoExpr.addArgument( value.fst.flatName().toString(), new SrcType( value.snd.type.toString() ), value.snd.getValue() ); } srcType.addAnnotation( annoExpr ); }