mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-20 19:14:38 +02:00
6992999: fully remove JSR 308 from langtools
Reviewed-by: mcimadamore
This commit is contained in:
parent
21c037bb9b
commit
43e78a8d44
40 changed files with 44 additions and 2440 deletions
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -53,7 +53,6 @@ public interface MethodTree extends Tree {
|
||||||
Tree getReturnType();
|
Tree getReturnType();
|
||||||
List<? extends TypeParameterTree> getTypeParameters();
|
List<? extends TypeParameterTree> getTypeParameters();
|
||||||
List<? extends VariableTree> getParameters();
|
List<? extends VariableTree> getParameters();
|
||||||
//308 List<? extends AnnotationTree> getReceiverAnnotations();
|
|
||||||
List<? extends ExpressionTree> getThrows();
|
List<? extends ExpressionTree> getThrows();
|
||||||
BlockTree getBody();
|
BlockTree getBody();
|
||||||
Tree getDefaultValue(); // for annotation types
|
Tree getDefaultValue(); // for annotation types
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -46,8 +46,6 @@ public interface Tree {
|
||||||
*/
|
*/
|
||||||
public enum Kind {
|
public enum Kind {
|
||||||
|
|
||||||
//308 ANNOTATED_TYPE(AnnotatedTypeTree.class),
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used for instances of {@link AnnotationTree}.
|
* Used for instances of {@link AnnotationTree}.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -57,7 +57,6 @@ package com.sun.source.tree;
|
||||||
* @since 1.6
|
* @since 1.6
|
||||||
*/
|
*/
|
||||||
public interface TreeVisitor<R,P> {
|
public interface TreeVisitor<R,P> {
|
||||||
//308 R visitAnnotatedType(AnnotatedTypeTree node, P p);
|
|
||||||
R visitAnnotation(AnnotationTree node, P p);
|
R visitAnnotation(AnnotationTree node, P p);
|
||||||
R visitMethodInvocation(MethodInvocationTree node, P p);
|
R visitMethodInvocation(MethodInvocationTree node, P p);
|
||||||
R visitAssert(AssertTree node, P p);
|
R visitAssert(AssertTree node, P p);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -47,5 +47,4 @@ import javax.lang.model.element.Name;
|
||||||
public interface TypeParameterTree extends Tree {
|
public interface TypeParameterTree extends Tree {
|
||||||
Name getName();
|
Name getName();
|
||||||
List<? extends Tree> getBounds();
|
List<? extends Tree> getBounds();
|
||||||
//308 List<? extends AnnotationTree> getAnnotations();
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -248,10 +248,6 @@ public class SimpleTreeVisitor <R,P> implements TreeVisitor<R,P> {
|
||||||
return defaultAction(node, p);
|
return defaultAction(node, p);
|
||||||
}
|
}
|
||||||
|
|
||||||
//308 public R visitAnnotatedType(AnnotatedTypeTree node, P p) {
|
|
||||||
//308 return defaultAction(node, p);
|
|
||||||
//308 }
|
|
||||||
|
|
||||||
public R visitErroneous(ErroneousTree node, P p) {
|
public R visitErroneous(ErroneousTree node, P p) {
|
||||||
return defaultAction(node, p);
|
return defaultAction(node, p);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -138,7 +138,6 @@ public class TreeScanner<R,P> implements TreeVisitor<R,P> {
|
||||||
r = scanAndReduce(node.getReturnType(), p, r);
|
r = scanAndReduce(node.getReturnType(), p, r);
|
||||||
r = scanAndReduce(node.getTypeParameters(), p, r);
|
r = scanAndReduce(node.getTypeParameters(), p, r);
|
||||||
r = scanAndReduce(node.getParameters(), p, r);
|
r = scanAndReduce(node.getParameters(), p, r);
|
||||||
//308 r = scanAndReduce(node.getReceiverAnnotations(), p, r);
|
|
||||||
r = scanAndReduce(node.getThrows(), p, r);
|
r = scanAndReduce(node.getThrows(), p, r);
|
||||||
r = scanAndReduce(node.getBody(), p, r);
|
r = scanAndReduce(node.getBody(), p, r);
|
||||||
r = scanAndReduce(node.getDefaultValue(), p, r);
|
r = scanAndReduce(node.getDefaultValue(), p, r);
|
||||||
|
@ -362,7 +361,6 @@ public class TreeScanner<R,P> implements TreeVisitor<R,P> {
|
||||||
|
|
||||||
public R visitTypeParameter(TypeParameterTree node, P p) {
|
public R visitTypeParameter(TypeParameterTree node, P p) {
|
||||||
R r = scan(node.getBounds(), p);
|
R r = scan(node.getBounds(), p);
|
||||||
//308 R r = scanAndReduce(node.getAnnotations(), p, r);
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -380,12 +378,6 @@ public class TreeScanner<R,P> implements TreeVisitor<R,P> {
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
//308 public R visitAnnotatedType(AnnotatedTypeTree node, P p) {
|
|
||||||
//308 R r = scan(node.getAnnotations(), p);
|
|
||||||
//308 r = scanAndReduce(node.getUnderlyingType(), p, r);
|
|
||||||
//308 return r;
|
|
||||||
//308 }
|
|
||||||
|
|
||||||
public R visitOther(Tree node, P p) {
|
public R visitOther(Tree node, P p) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -54,8 +54,6 @@ public abstract class Attribute {
|
||||||
public static final String RuntimeInvisibleAnnotations = "RuntimeInvisibleAnnotations";
|
public static final String RuntimeInvisibleAnnotations = "RuntimeInvisibleAnnotations";
|
||||||
public static final String RuntimeVisibleParameterAnnotations = "RuntimeVisibleParameterAnnotations";
|
public static final String RuntimeVisibleParameterAnnotations = "RuntimeVisibleParameterAnnotations";
|
||||||
public static final String RuntimeInvisibleParameterAnnotations = "RuntimeInvisibleParameterAnnotations";
|
public static final String RuntimeInvisibleParameterAnnotations = "RuntimeInvisibleParameterAnnotations";
|
||||||
public static final String RuntimeVisibleTypeAnnotations = "RuntimeVisibleTypeAnnotations";
|
|
||||||
public static final String RuntimeInvisibleTypeAnnotations = "RuntimeInvisibleTypeAnnotations";
|
|
||||||
public static final String Signature = "Signature";
|
public static final String Signature = "Signature";
|
||||||
public static final String SourceDebugExtension = "SourceDebugExtension";
|
public static final String SourceDebugExtension = "SourceDebugExtension";
|
||||||
public static final String SourceFile = "SourceFile";
|
public static final String SourceFile = "SourceFile";
|
||||||
|
@ -118,8 +116,6 @@ public abstract class Attribute {
|
||||||
standardAttributes.put(RuntimeInvisibleParameterAnnotations, RuntimeInvisibleParameterAnnotations_attribute.class);
|
standardAttributes.put(RuntimeInvisibleParameterAnnotations, RuntimeInvisibleParameterAnnotations_attribute.class);
|
||||||
standardAttributes.put(RuntimeVisibleAnnotations, RuntimeVisibleAnnotations_attribute.class);
|
standardAttributes.put(RuntimeVisibleAnnotations, RuntimeVisibleAnnotations_attribute.class);
|
||||||
standardAttributes.put(RuntimeVisibleParameterAnnotations, RuntimeVisibleParameterAnnotations_attribute.class);
|
standardAttributes.put(RuntimeVisibleParameterAnnotations, RuntimeVisibleParameterAnnotations_attribute.class);
|
||||||
standardAttributes.put(RuntimeVisibleTypeAnnotations, RuntimeVisibleTypeAnnotations_attribute.class);
|
|
||||||
standardAttributes.put(RuntimeInvisibleTypeAnnotations, RuntimeInvisibleTypeAnnotations_attribute.class);
|
|
||||||
standardAttributes.put(Signature, Signature_attribute.class);
|
standardAttributes.put(Signature, Signature_attribute.class);
|
||||||
standardAttributes.put(SourceID, SourceID_attribute.class);
|
standardAttributes.put(SourceID, SourceID_attribute.class);
|
||||||
}
|
}
|
||||||
|
@ -176,8 +172,6 @@ public abstract class Attribute {
|
||||||
R visitRuntimeInvisibleAnnotations(RuntimeInvisibleAnnotations_attribute attr, P p);
|
R visitRuntimeInvisibleAnnotations(RuntimeInvisibleAnnotations_attribute attr, P p);
|
||||||
R visitRuntimeVisibleParameterAnnotations(RuntimeVisibleParameterAnnotations_attribute attr, P p);
|
R visitRuntimeVisibleParameterAnnotations(RuntimeVisibleParameterAnnotations_attribute attr, P p);
|
||||||
R visitRuntimeInvisibleParameterAnnotations(RuntimeInvisibleParameterAnnotations_attribute attr, P p);
|
R visitRuntimeInvisibleParameterAnnotations(RuntimeInvisibleParameterAnnotations_attribute attr, P p);
|
||||||
R visitRuntimeVisibleTypeAnnotations(RuntimeVisibleTypeAnnotations_attribute attr, P p);
|
|
||||||
R visitRuntimeInvisibleTypeAnnotations(RuntimeInvisibleTypeAnnotations_attribute attr, P p);
|
|
||||||
R visitSignature(Signature_attribute attr, P p);
|
R visitSignature(Signature_attribute attr, P p);
|
||||||
R visitSourceDebugExtension(SourceDebugExtension_attribute attr, P p);
|
R visitSourceDebugExtension(SourceDebugExtension_attribute attr, P p);
|
||||||
R visitSourceFile(SourceFile_attribute attr, P p);
|
R visitSourceFile(SourceFile_attribute attr, P p);
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -459,16 +459,6 @@ public class ClassWriter {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Void visitRuntimeVisibleTypeAnnotations(RuntimeVisibleTypeAnnotations_attribute attr, ClassOutputStream out) {
|
|
||||||
annotationWriter.write(attr.annotations, out);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Void visitRuntimeInvisibleTypeAnnotations(RuntimeInvisibleTypeAnnotations_attribute attr, ClassOutputStream out) {
|
|
||||||
annotationWriter.write(attr.annotations, out);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Void visitRuntimeVisibleParameterAnnotations(RuntimeVisibleParameterAnnotations_attribute attr, ClassOutputStream out) {
|
public Void visitRuntimeVisibleParameterAnnotations(RuntimeVisibleParameterAnnotations_attribute attr, ClassOutputStream out) {
|
||||||
out.writeByte(attr.parameter_annotations.length);
|
out.writeByte(attr.parameter_annotations.length);
|
||||||
for (Annotation[] annos: attr.parameter_annotations)
|
for (Annotation[] annos: attr.parameter_annotations)
|
||||||
|
@ -628,12 +618,6 @@ public class ClassWriter {
|
||||||
write(anno, out);
|
write(anno, out);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void write(ExtendedAnnotation[] annos, ClassOutputStream out) {
|
|
||||||
out.writeShort(annos.length);
|
|
||||||
for (ExtendedAnnotation anno: annos)
|
|
||||||
write(anno, out);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void write(Annotation anno, ClassOutputStream out) {
|
public void write(Annotation anno, ClassOutputStream out) {
|
||||||
out.writeShort(anno.type_index);
|
out.writeShort(anno.type_index);
|
||||||
out.writeShort(anno.element_value_pairs.length);
|
out.writeShort(anno.element_value_pairs.length);
|
||||||
|
@ -641,11 +625,6 @@ public class ClassWriter {
|
||||||
write(p, out);
|
write(p, out);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void write(ExtendedAnnotation anno, ClassOutputStream out) {
|
|
||||||
write(anno.annotation, out);
|
|
||||||
write(anno.position, out);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void write(element_value_pair pair, ClassOutputStream out) {
|
public void write(element_value_pair pair, ClassOutputStream out) {
|
||||||
out.writeShort(pair.element_name_index);
|
out.writeShort(pair.element_name_index);
|
||||||
write(pair.value, out);
|
write(pair.value, out);
|
||||||
|
@ -684,95 +663,5 @@ public class ClassWriter {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void write(ExtendedAnnotation.Position p, ClassOutputStream out) {
|
|
||||||
out.writeByte(p.type.targetTypeValue());
|
|
||||||
switch (p.type) {
|
|
||||||
// type case
|
|
||||||
case TYPECAST:
|
|
||||||
case TYPECAST_GENERIC_OR_ARRAY:
|
|
||||||
// object creation
|
|
||||||
case INSTANCEOF:
|
|
||||||
case INSTANCEOF_GENERIC_OR_ARRAY:
|
|
||||||
// new expression
|
|
||||||
case NEW:
|
|
||||||
case NEW_GENERIC_OR_ARRAY:
|
|
||||||
case NEW_TYPE_ARGUMENT:
|
|
||||||
case NEW_TYPE_ARGUMENT_GENERIC_OR_ARRAY:
|
|
||||||
out.writeShort(p.offset);
|
|
||||||
break;
|
|
||||||
// local variable
|
|
||||||
case LOCAL_VARIABLE:
|
|
||||||
case LOCAL_VARIABLE_GENERIC_OR_ARRAY:
|
|
||||||
int table_length = p.lvarOffset.length;
|
|
||||||
out.writeShort(table_length);
|
|
||||||
for (int i = 0; i < table_length; ++i) {
|
|
||||||
out.writeShort(1); // for table length
|
|
||||||
out.writeShort(p.lvarOffset[i]);
|
|
||||||
out.writeShort(p.lvarLength[i]);
|
|
||||||
out.writeShort(p.lvarIndex[i]);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
// method receiver
|
|
||||||
case METHOD_RECEIVER:
|
|
||||||
// Do nothing
|
|
||||||
break;
|
|
||||||
// type parameters
|
|
||||||
case CLASS_TYPE_PARAMETER:
|
|
||||||
case METHOD_TYPE_PARAMETER:
|
|
||||||
out.writeByte(p.parameter_index);
|
|
||||||
break;
|
|
||||||
// type parameters bounds
|
|
||||||
case CLASS_TYPE_PARAMETER_BOUND:
|
|
||||||
case CLASS_TYPE_PARAMETER_BOUND_GENERIC_OR_ARRAY:
|
|
||||||
case METHOD_TYPE_PARAMETER_BOUND:
|
|
||||||
case METHOD_TYPE_PARAMETER_BOUND_GENERIC_OR_ARRAY:
|
|
||||||
out.writeByte(p.parameter_index);
|
|
||||||
out.writeByte(p.bound_index);
|
|
||||||
break;
|
|
||||||
// wildcards
|
|
||||||
case WILDCARD_BOUND:
|
|
||||||
case WILDCARD_BOUND_GENERIC_OR_ARRAY:
|
|
||||||
write(p.wildcard_position, out);
|
|
||||||
break;
|
|
||||||
// Class extends and implements clauses
|
|
||||||
case CLASS_EXTENDS:
|
|
||||||
case CLASS_EXTENDS_GENERIC_OR_ARRAY:
|
|
||||||
out.writeByte(p.type_index);
|
|
||||||
break;
|
|
||||||
// throws
|
|
||||||
case THROWS:
|
|
||||||
out.writeByte(p.type_index);
|
|
||||||
break;
|
|
||||||
case CLASS_LITERAL:
|
|
||||||
case CLASS_LITERAL_GENERIC_OR_ARRAY:
|
|
||||||
out.writeShort(p.offset);
|
|
||||||
break;
|
|
||||||
// method parameter: not specified
|
|
||||||
case METHOD_PARAMETER_GENERIC_OR_ARRAY:
|
|
||||||
out.writeByte(p.parameter_index);
|
|
||||||
break;
|
|
||||||
// method type argument: wasn't specified
|
|
||||||
case METHOD_TYPE_ARGUMENT:
|
|
||||||
case METHOD_TYPE_ARGUMENT_GENERIC_OR_ARRAY:
|
|
||||||
out.writeShort(p.offset);
|
|
||||||
out.writeByte(p.type_index);
|
|
||||||
break;
|
|
||||||
// We don't need to worry abut these
|
|
||||||
case METHOD_RETURN_GENERIC_OR_ARRAY:
|
|
||||||
case FIELD_GENERIC_OR_ARRAY:
|
|
||||||
break;
|
|
||||||
case UNKNOWN:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new AssertionError("unknown type: " + p);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Append location data for generics/arrays.
|
|
||||||
if (p.type.hasLocation()) {
|
|
||||||
out.writeShort(p.location.size());
|
|
||||||
for (int i : p.location)
|
|
||||||
out.writeByte((byte)i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,612 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
|
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
||||||
*
|
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms of the GNU General Public License version 2 only, as
|
|
||||||
* published by the Free Software Foundation. Oracle designates this
|
|
||||||
* particular file as subject to the "Classpath" exception as provided
|
|
||||||
* by Oracle in the LICENSE file that accompanied this code.
|
|
||||||
*
|
|
||||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
* version 2 for more details (a copy is included in the LICENSE file that
|
|
||||||
* accompanied this code).
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License version
|
|
||||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
||||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
*
|
|
||||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
||||||
* or visit www.oracle.com if you need additional information or have any
|
|
||||||
* questions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.sun.tools.classfile;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.EnumSet;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import static com.sun.tools.classfile.ExtendedAnnotation.TargetAttribute.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* See JSR 308 specification, section 4.1
|
|
||||||
*
|
|
||||||
* <p><b>This is NOT part of any supported API.
|
|
||||||
* If you write code that depends on this, you do so at your own risk.
|
|
||||||
* This code and its internal interfaces are subject to change or
|
|
||||||
* deletion without notice.</b>
|
|
||||||
*/
|
|
||||||
public class ExtendedAnnotation {
|
|
||||||
ExtendedAnnotation(ClassReader cr) throws IOException, Annotation.InvalidAnnotation {
|
|
||||||
annotation = new Annotation(cr);
|
|
||||||
position = read_position(cr);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ExtendedAnnotation(ConstantPool constant_pool,
|
|
||||||
Annotation annotation, Position position) {
|
|
||||||
this.annotation = annotation;
|
|
||||||
this.position = position;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int length() {
|
|
||||||
int n = annotation.length();
|
|
||||||
n += position_length(position);
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final Annotation annotation;
|
|
||||||
public final Position position;
|
|
||||||
|
|
||||||
private static Position read_position(ClassReader cr) throws IOException, Annotation.InvalidAnnotation {
|
|
||||||
// Copied from ClassReader
|
|
||||||
int tag = (byte)cr.readUnsignedByte(); // cast to introduce signedness
|
|
||||||
if (!TargetType.isValidTargetTypeValue(tag))
|
|
||||||
throw new Annotation.InvalidAnnotation("invalid type annotation target type value: " + tag);
|
|
||||||
|
|
||||||
TargetType type = TargetType.fromTargetTypeValue(tag);
|
|
||||||
|
|
||||||
Position position = new Position();
|
|
||||||
position.type = type;
|
|
||||||
|
|
||||||
switch (type) {
|
|
||||||
// type case
|
|
||||||
case TYPECAST:
|
|
||||||
case TYPECAST_GENERIC_OR_ARRAY:
|
|
||||||
// object creation
|
|
||||||
case INSTANCEOF:
|
|
||||||
case INSTANCEOF_GENERIC_OR_ARRAY:
|
|
||||||
// new expression
|
|
||||||
case NEW:
|
|
||||||
case NEW_GENERIC_OR_ARRAY:
|
|
||||||
position.offset = cr.readUnsignedShort();
|
|
||||||
break;
|
|
||||||
// local variable
|
|
||||||
case LOCAL_VARIABLE:
|
|
||||||
case LOCAL_VARIABLE_GENERIC_OR_ARRAY:
|
|
||||||
int table_length = cr.readUnsignedShort();
|
|
||||||
position.lvarOffset = new int[table_length];
|
|
||||||
position.lvarLength = new int[table_length];
|
|
||||||
position.lvarIndex = new int[table_length];
|
|
||||||
for (int i = 0; i < table_length; ++i) {
|
|
||||||
position.lvarOffset[i] = cr.readUnsignedShort();
|
|
||||||
position.lvarLength[i] = cr.readUnsignedShort();
|
|
||||||
position.lvarIndex[i] = cr.readUnsignedShort();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
// method receiver
|
|
||||||
case METHOD_RECEIVER:
|
|
||||||
// Do nothing
|
|
||||||
break;
|
|
||||||
// type parameters
|
|
||||||
case CLASS_TYPE_PARAMETER:
|
|
||||||
case METHOD_TYPE_PARAMETER:
|
|
||||||
position.parameter_index = cr.readUnsignedByte();
|
|
||||||
break;
|
|
||||||
// type parameter bounds
|
|
||||||
case CLASS_TYPE_PARAMETER_BOUND:
|
|
||||||
case CLASS_TYPE_PARAMETER_BOUND_GENERIC_OR_ARRAY:
|
|
||||||
case METHOD_TYPE_PARAMETER_BOUND:
|
|
||||||
case METHOD_TYPE_PARAMETER_BOUND_GENERIC_OR_ARRAY:
|
|
||||||
position.parameter_index = cr.readUnsignedByte();
|
|
||||||
position.bound_index = cr.readUnsignedByte();
|
|
||||||
break;
|
|
||||||
// wildcards
|
|
||||||
case WILDCARD_BOUND:
|
|
||||||
case WILDCARD_BOUND_GENERIC_OR_ARRAY:
|
|
||||||
position.wildcard_position = read_position(cr);
|
|
||||||
break;
|
|
||||||
// Class extends and implements clauses
|
|
||||||
case CLASS_EXTENDS:
|
|
||||||
case CLASS_EXTENDS_GENERIC_OR_ARRAY:
|
|
||||||
int in = cr.readUnsignedShort();
|
|
||||||
if (in == 0xFFFF)
|
|
||||||
in = -1;
|
|
||||||
position.type_index = in;
|
|
||||||
break;
|
|
||||||
// throws
|
|
||||||
case THROWS:
|
|
||||||
position.type_index = cr.readUnsignedShort();
|
|
||||||
break;
|
|
||||||
case CLASS_LITERAL:
|
|
||||||
case CLASS_LITERAL_GENERIC_OR_ARRAY:
|
|
||||||
position.offset = cr.readUnsignedShort();
|
|
||||||
break;
|
|
||||||
// method parameter: not specified
|
|
||||||
case METHOD_PARAMETER_GENERIC_OR_ARRAY:
|
|
||||||
position.parameter_index = cr.readUnsignedByte();
|
|
||||||
break;
|
|
||||||
// method type argument: wasn't specified
|
|
||||||
case NEW_TYPE_ARGUMENT:
|
|
||||||
case NEW_TYPE_ARGUMENT_GENERIC_OR_ARRAY:
|
|
||||||
case METHOD_TYPE_ARGUMENT:
|
|
||||||
case METHOD_TYPE_ARGUMENT_GENERIC_OR_ARRAY:
|
|
||||||
position.offset = cr.readUnsignedShort();
|
|
||||||
position.type_index = cr.readUnsignedByte();
|
|
||||||
break;
|
|
||||||
// We don't need to worry abut these
|
|
||||||
case METHOD_RETURN_GENERIC_OR_ARRAY:
|
|
||||||
case FIELD_GENERIC_OR_ARRAY:
|
|
||||||
break;
|
|
||||||
case UNKNOWN:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new AssertionError("Cannot be here");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (type.hasLocation()) {
|
|
||||||
int len = cr.readUnsignedShort();
|
|
||||||
List<Integer> loc = new ArrayList<Integer>(len);
|
|
||||||
for (int i = 0; i < len; i++)
|
|
||||||
loc.add(cr.readUnsignedByte());
|
|
||||||
position.location = loc;
|
|
||||||
}
|
|
||||||
return position;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static int position_length(Position pos) {
|
|
||||||
int n = 0;
|
|
||||||
n += 1; // target_type
|
|
||||||
switch (pos.type) {
|
|
||||||
// type case
|
|
||||||
case TYPECAST:
|
|
||||||
case TYPECAST_GENERIC_OR_ARRAY:
|
|
||||||
// object creation
|
|
||||||
case INSTANCEOF:
|
|
||||||
case INSTANCEOF_GENERIC_OR_ARRAY:
|
|
||||||
// new expression
|
|
||||||
case NEW:
|
|
||||||
case NEW_GENERIC_OR_ARRAY:
|
|
||||||
n += 2;
|
|
||||||
break;
|
|
||||||
// local variable
|
|
||||||
case LOCAL_VARIABLE:
|
|
||||||
case LOCAL_VARIABLE_GENERIC_OR_ARRAY:
|
|
||||||
n += 2; // table_length;
|
|
||||||
int table_length = pos.lvarOffset.length;
|
|
||||||
n += 2 * table_length; // offset
|
|
||||||
n += 2 * table_length; // length;
|
|
||||||
n += 2 * table_length; // index
|
|
||||||
break;
|
|
||||||
// method receiver
|
|
||||||
case METHOD_RECEIVER:
|
|
||||||
// Do nothing
|
|
||||||
break;
|
|
||||||
// type parameters
|
|
||||||
case CLASS_TYPE_PARAMETER:
|
|
||||||
case METHOD_TYPE_PARAMETER:
|
|
||||||
n += 1; // parameter_index;
|
|
||||||
break;
|
|
||||||
// type parameter bounds
|
|
||||||
case CLASS_TYPE_PARAMETER_BOUND:
|
|
||||||
case CLASS_TYPE_PARAMETER_BOUND_GENERIC_OR_ARRAY:
|
|
||||||
case METHOD_TYPE_PARAMETER_BOUND:
|
|
||||||
case METHOD_TYPE_PARAMETER_BOUND_GENERIC_OR_ARRAY:
|
|
||||||
n += 1; // parameter_index
|
|
||||||
n += 1; // bound_index
|
|
||||||
break;
|
|
||||||
case WILDCARD_BOUND:
|
|
||||||
case WILDCARD_BOUND_GENERIC_OR_ARRAY:
|
|
||||||
n += position_length(pos.wildcard_position);
|
|
||||||
break;
|
|
||||||
// Class extends and implements clauses
|
|
||||||
case CLASS_EXTENDS:
|
|
||||||
case CLASS_EXTENDS_GENERIC_OR_ARRAY:
|
|
||||||
n += 2; // type_index
|
|
||||||
break;
|
|
||||||
// throws
|
|
||||||
case THROWS:
|
|
||||||
n += 2; // type_index
|
|
||||||
break;
|
|
||||||
case CLASS_LITERAL:
|
|
||||||
case CLASS_LITERAL_GENERIC_OR_ARRAY:
|
|
||||||
n += 1; // offset
|
|
||||||
break;
|
|
||||||
// method parameter: not specified
|
|
||||||
case METHOD_PARAMETER_GENERIC_OR_ARRAY:
|
|
||||||
n += 1; // parameter_index
|
|
||||||
break;
|
|
||||||
// method type argument: wasn't specified
|
|
||||||
case NEW_TYPE_ARGUMENT:
|
|
||||||
case NEW_TYPE_ARGUMENT_GENERIC_OR_ARRAY:
|
|
||||||
case METHOD_TYPE_ARGUMENT:
|
|
||||||
case METHOD_TYPE_ARGUMENT_GENERIC_OR_ARRAY:
|
|
||||||
n += 2; // offset
|
|
||||||
n += 1; // type index
|
|
||||||
break;
|
|
||||||
// We don't need to worry abut these
|
|
||||||
case METHOD_RETURN_GENERIC_OR_ARRAY:
|
|
||||||
case FIELD_GENERIC_OR_ARRAY:
|
|
||||||
break;
|
|
||||||
case UNKNOWN:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pos.type.hasLocation()) {
|
|
||||||
n += 2; // length
|
|
||||||
n += 1 * pos.location.size(); // actual array size
|
|
||||||
}
|
|
||||||
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Code duplicated from com.sun.tools.javac.code.TypeAnnotations.Position
|
|
||||||
public static class Position {
|
|
||||||
|
|
||||||
public TargetType type = TargetType.UNKNOWN;
|
|
||||||
|
|
||||||
// For generic/array types.
|
|
||||||
public List<Integer> location = new ArrayList<Integer>();
|
|
||||||
|
|
||||||
// For typecasts, type tests, new (and locals, as start_pc).
|
|
||||||
public int offset = -1;
|
|
||||||
|
|
||||||
// For locals.
|
|
||||||
public int[] lvarOffset = null;
|
|
||||||
public int[] lvarLength = null;
|
|
||||||
public int[] lvarIndex = null;
|
|
||||||
|
|
||||||
// For type parameter bound
|
|
||||||
public int bound_index = Integer.MIN_VALUE;
|
|
||||||
|
|
||||||
// For type parameter and method parameter
|
|
||||||
public int parameter_index = Integer.MIN_VALUE;
|
|
||||||
|
|
||||||
// For class extends, implements, and throws classes
|
|
||||||
public int type_index = Integer.MIN_VALUE;
|
|
||||||
|
|
||||||
// For wildcards
|
|
||||||
public Position wildcard_position = null;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
sb.append('[');
|
|
||||||
sb.append(type);
|
|
||||||
|
|
||||||
switch (type) {
|
|
||||||
// type case
|
|
||||||
case TYPECAST:
|
|
||||||
case TYPECAST_GENERIC_OR_ARRAY:
|
|
||||||
// object creation
|
|
||||||
case INSTANCEOF:
|
|
||||||
case INSTANCEOF_GENERIC_OR_ARRAY:
|
|
||||||
// new expression
|
|
||||||
case NEW:
|
|
||||||
case NEW_GENERIC_OR_ARRAY:
|
|
||||||
case NEW_TYPE_ARGUMENT:
|
|
||||||
case NEW_TYPE_ARGUMENT_GENERIC_OR_ARRAY:
|
|
||||||
sb.append(", offset = ");
|
|
||||||
sb.append(offset);
|
|
||||||
break;
|
|
||||||
// local variable
|
|
||||||
case LOCAL_VARIABLE:
|
|
||||||
case LOCAL_VARIABLE_GENERIC_OR_ARRAY:
|
|
||||||
sb.append(", {");
|
|
||||||
for (int i = 0; i < lvarOffset.length; ++i) {
|
|
||||||
if (i != 0) sb.append("; ");
|
|
||||||
sb.append(", start_pc = ");
|
|
||||||
sb.append(lvarOffset[i]);
|
|
||||||
sb.append(", length = ");
|
|
||||||
sb.append(lvarLength[i]);
|
|
||||||
sb.append(", index = ");
|
|
||||||
sb.append(lvarIndex[i]);
|
|
||||||
}
|
|
||||||
sb.append("}");
|
|
||||||
break;
|
|
||||||
// method receiver
|
|
||||||
case METHOD_RECEIVER:
|
|
||||||
// Do nothing
|
|
||||||
break;
|
|
||||||
// type parameters
|
|
||||||
case CLASS_TYPE_PARAMETER:
|
|
||||||
case METHOD_TYPE_PARAMETER:
|
|
||||||
sb.append(", param_index = ");
|
|
||||||
sb.append(parameter_index);
|
|
||||||
break;
|
|
||||||
// type parameters bound
|
|
||||||
case CLASS_TYPE_PARAMETER_BOUND:
|
|
||||||
case CLASS_TYPE_PARAMETER_BOUND_GENERIC_OR_ARRAY:
|
|
||||||
case METHOD_TYPE_PARAMETER_BOUND:
|
|
||||||
case METHOD_TYPE_PARAMETER_BOUND_GENERIC_OR_ARRAY:
|
|
||||||
sb.append(", param_index = ");
|
|
||||||
sb.append(parameter_index);
|
|
||||||
sb.append(", bound_index = ");
|
|
||||||
sb.append(bound_index);
|
|
||||||
break;
|
|
||||||
// wildcard
|
|
||||||
case WILDCARD_BOUND:
|
|
||||||
case WILDCARD_BOUND_GENERIC_OR_ARRAY:
|
|
||||||
sb.append(", wild_card = ");
|
|
||||||
sb.append(wildcard_position);
|
|
||||||
break;
|
|
||||||
// Class extends and implements clauses
|
|
||||||
case CLASS_EXTENDS:
|
|
||||||
case CLASS_EXTENDS_GENERIC_OR_ARRAY:
|
|
||||||
sb.append(", type_index = ");
|
|
||||||
sb.append(type_index);
|
|
||||||
break;
|
|
||||||
// throws
|
|
||||||
case THROWS:
|
|
||||||
sb.append(", type_index = ");
|
|
||||||
sb.append(type_index);
|
|
||||||
break;
|
|
||||||
case CLASS_LITERAL:
|
|
||||||
case CLASS_LITERAL_GENERIC_OR_ARRAY:
|
|
||||||
sb.append(", offset = ");
|
|
||||||
sb.append(offset);
|
|
||||||
break;
|
|
||||||
// method parameter: not specified
|
|
||||||
case METHOD_PARAMETER_GENERIC_OR_ARRAY:
|
|
||||||
sb.append(", param_index = ");
|
|
||||||
sb.append(parameter_index);
|
|
||||||
break;
|
|
||||||
// method type argument: wasn't specified
|
|
||||||
case METHOD_TYPE_ARGUMENT:
|
|
||||||
case METHOD_TYPE_ARGUMENT_GENERIC_OR_ARRAY:
|
|
||||||
sb.append(", offset = ");
|
|
||||||
sb.append(offset);
|
|
||||||
sb.append(", type_index = ");
|
|
||||||
sb.append(type_index);
|
|
||||||
break;
|
|
||||||
// We don't need to worry abut these
|
|
||||||
case METHOD_RETURN_GENERIC_OR_ARRAY:
|
|
||||||
case FIELD_GENERIC_OR_ARRAY:
|
|
||||||
break;
|
|
||||||
case UNKNOWN:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new AssertionError("unknown type: " + type);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Append location data for generics/arrays.
|
|
||||||
if (type.hasLocation()) {
|
|
||||||
sb.append(", location = (");
|
|
||||||
sb.append(location);
|
|
||||||
sb.append(")");
|
|
||||||
}
|
|
||||||
|
|
||||||
sb.append(']');
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Code duplicated from com.sun.tools.javac.comp.TargetType
|
|
||||||
public enum TargetType {
|
|
||||||
|
|
||||||
/** For annotations on typecasts. */
|
|
||||||
TYPECAST(0x00),
|
|
||||||
|
|
||||||
/** For annotations on a type argument or nested array of a typecast. */
|
|
||||||
TYPECAST_GENERIC_OR_ARRAY(0x01, HasLocation),
|
|
||||||
|
|
||||||
/** For annotations on type tests. */
|
|
||||||
INSTANCEOF(0x02),
|
|
||||||
|
|
||||||
/** For annotations on a type argument or nested array of a type test. */
|
|
||||||
INSTANCEOF_GENERIC_OR_ARRAY(0x03, HasLocation),
|
|
||||||
|
|
||||||
/** For annotations on object creation expressions. */
|
|
||||||
NEW(0x04),
|
|
||||||
|
|
||||||
/**
|
|
||||||
* For annotations on a type argument or nested array of an object creation
|
|
||||||
* expression.
|
|
||||||
*/
|
|
||||||
NEW_GENERIC_OR_ARRAY(0x05, HasLocation),
|
|
||||||
|
|
||||||
|
|
||||||
/** For annotations on the method receiver. */
|
|
||||||
METHOD_RECEIVER(0x06),
|
|
||||||
|
|
||||||
// invalid location
|
|
||||||
// METHOD_RECEIVER_GENERIC_OR_ARRAY(0x07, HasLocation),
|
|
||||||
|
|
||||||
/** For annotations on local variables. */
|
|
||||||
LOCAL_VARIABLE(0x08),
|
|
||||||
|
|
||||||
/** For annotations on a type argument or nested array of a local. */
|
|
||||||
LOCAL_VARIABLE_GENERIC_OR_ARRAY(0x09, HasLocation),
|
|
||||||
|
|
||||||
// already handled by regular annotations
|
|
||||||
// METHOD_RETURN(0x0A),
|
|
||||||
|
|
||||||
/**
|
|
||||||
* For annotations on a type argument or nested array of a method return
|
|
||||||
* type.
|
|
||||||
*/
|
|
||||||
METHOD_RETURN_GENERIC_OR_ARRAY(0x0B, HasLocation),
|
|
||||||
|
|
||||||
// already handled by regular annotations
|
|
||||||
// METHOD_PARAMETER(0x0C),
|
|
||||||
|
|
||||||
/** For annotations on a type argument or nested array of a method parameter. */
|
|
||||||
METHOD_PARAMETER_GENERIC_OR_ARRAY(0x0D, HasLocation),
|
|
||||||
|
|
||||||
// already handled by regular annotations
|
|
||||||
// FIELD(0x0E),
|
|
||||||
|
|
||||||
/** For annotations on a type argument or nested array of a field. */
|
|
||||||
FIELD_GENERIC_OR_ARRAY(0x0F, HasLocation),
|
|
||||||
|
|
||||||
/** For annotations on a bound of a type parameter of a class. */
|
|
||||||
CLASS_TYPE_PARAMETER_BOUND(0x10, HasBound, HasParameter),
|
|
||||||
|
|
||||||
/**
|
|
||||||
* For annotations on a type argument or nested array of a bound of a type
|
|
||||||
* parameter of a class.
|
|
||||||
*/
|
|
||||||
CLASS_TYPE_PARAMETER_BOUND_GENERIC_OR_ARRAY(0x11, HasBound, HasLocation, HasParameter),
|
|
||||||
|
|
||||||
/** For annotations on a bound of a type parameter of a method. */
|
|
||||||
METHOD_TYPE_PARAMETER_BOUND(0x12, HasBound, HasParameter),
|
|
||||||
|
|
||||||
/**
|
|
||||||
* For annotations on a type argument or nested array of a bound of a type
|
|
||||||
* parameter of a method.
|
|
||||||
*/
|
|
||||||
METHOD_TYPE_PARAMETER_BOUND_GENERIC_OR_ARRAY(0x13, HasBound, HasLocation, HasParameter),
|
|
||||||
|
|
||||||
/** For annotations on the type of an "extends" or "implements" clause. */
|
|
||||||
CLASS_EXTENDS(0x14),
|
|
||||||
|
|
||||||
/** For annotations on the inner type of an "extends" or "implements" clause. */
|
|
||||||
CLASS_EXTENDS_GENERIC_OR_ARRAY(0x15, HasLocation),
|
|
||||||
|
|
||||||
/** For annotations on a throws clause in a method declaration. */
|
|
||||||
THROWS(0x16),
|
|
||||||
|
|
||||||
// invalid location
|
|
||||||
// THROWS_GENERIC_OR_ARRAY(0x17, HasLocation),
|
|
||||||
|
|
||||||
/** For annotations in type arguments of object creation expressions. */
|
|
||||||
NEW_TYPE_ARGUMENT(0x18),
|
|
||||||
NEW_TYPE_ARGUMENT_GENERIC_OR_ARRAY(0x19, HasLocation),
|
|
||||||
|
|
||||||
METHOD_TYPE_ARGUMENT(0x1A),
|
|
||||||
METHOD_TYPE_ARGUMENT_GENERIC_OR_ARRAY(0x1B, HasLocation),
|
|
||||||
|
|
||||||
WILDCARD_BOUND(0x1C, HasBound),
|
|
||||||
WILDCARD_BOUND_GENERIC_OR_ARRAY(0x1D, HasBound, HasLocation),
|
|
||||||
|
|
||||||
CLASS_LITERAL(0x1E),
|
|
||||||
CLASS_LITERAL_GENERIC_OR_ARRAY(0x1F, HasLocation),
|
|
||||||
|
|
||||||
METHOD_TYPE_PARAMETER(0x20, HasParameter),
|
|
||||||
|
|
||||||
// invalid location
|
|
||||||
// METHOD_TYPE_PARAMETER_GENERIC_OR_ARRAY(0x21, HasLocation, HasParameter),
|
|
||||||
|
|
||||||
CLASS_TYPE_PARAMETER(0x22, HasParameter),
|
|
||||||
|
|
||||||
// invalid location
|
|
||||||
// CLASS_TYPE_PARAMETER_GENERIC_OR_ARRAY(0x23, HasLocation, HasParameter),
|
|
||||||
|
|
||||||
/** For annotations with an unknown target. */
|
|
||||||
UNKNOWN(-1);
|
|
||||||
|
|
||||||
static final int MAXIMUM_TARGET_TYPE_VALUE = 0x22;
|
|
||||||
|
|
||||||
private final int targetTypeValue;
|
|
||||||
private Set<TargetAttribute> flags;
|
|
||||||
|
|
||||||
TargetType(int targetTypeValue, TargetAttribute... attrs) {
|
|
||||||
if (targetTypeValue < Byte.MIN_VALUE
|
|
||||||
|| targetTypeValue > Byte.MAX_VALUE)
|
|
||||||
throw new AssertionError("attribute type value needs to be a byte: " + targetTypeValue);
|
|
||||||
this.targetTypeValue = (byte)targetTypeValue;
|
|
||||||
this.flags = EnumSet.noneOf(TargetAttribute.class);
|
|
||||||
for (TargetAttribute attr : attrs)
|
|
||||||
this.flags.add(attr);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns whether or not this TargetType represents an annotation whose
|
|
||||||
* target is an inner type of a generic or array type.
|
|
||||||
*
|
|
||||||
* @return true if this TargetType represents an annotation on an inner
|
|
||||||
* type, false otherwise
|
|
||||||
*/
|
|
||||||
public boolean hasLocation() {
|
|
||||||
return flags.contains(HasLocation);
|
|
||||||
}
|
|
||||||
|
|
||||||
public TargetType getGenericComplement() {
|
|
||||||
if (hasLocation())
|
|
||||||
return this;
|
|
||||||
else
|
|
||||||
return fromTargetTypeValue(targetTypeValue() + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns whether or not this TargetType represents an annotation whose
|
|
||||||
* target has a parameter index.
|
|
||||||
*
|
|
||||||
* @return true if this TargetType has a parameter index,
|
|
||||||
* false otherwise
|
|
||||||
*/
|
|
||||||
public boolean hasParameter() {
|
|
||||||
return flags.contains(HasParameter);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns whether or not this TargetType represents an annotation whose
|
|
||||||
* target is a type parameter bound.
|
|
||||||
*
|
|
||||||
* @return true if this TargetType represents an type parameter bound
|
|
||||||
* annotation, false otherwise
|
|
||||||
*/
|
|
||||||
public boolean hasBound() {
|
|
||||||
return flags.contains(HasBound);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int targetTypeValue() {
|
|
||||||
return this.targetTypeValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static TargetType[] targets = null;
|
|
||||||
|
|
||||||
private static TargetType[] buildTargets() {
|
|
||||||
TargetType[] targets = new TargetType[MAXIMUM_TARGET_TYPE_VALUE + 1];
|
|
||||||
TargetType[] alltargets = values();
|
|
||||||
for (TargetType target : alltargets)
|
|
||||||
if (target.targetTypeValue >= 0)
|
|
||||||
targets[target.targetTypeValue] = target;
|
|
||||||
for (int i = 0; i <= MAXIMUM_TARGET_TYPE_VALUE; ++i)
|
|
||||||
if (targets[i] == null)
|
|
||||||
targets[i] = UNKNOWN;
|
|
||||||
return targets;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isValidTargetTypeValue(int tag) {
|
|
||||||
if (targets == null)
|
|
||||||
targets = buildTargets();
|
|
||||||
|
|
||||||
if (((byte)tag) == ((byte)UNKNOWN.targetTypeValue))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return (tag >= 0 && tag < targets.length);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static TargetType fromTargetTypeValue(int tag) {
|
|
||||||
if (targets == null)
|
|
||||||
targets = buildTargets();
|
|
||||||
|
|
||||||
if (((byte)tag) == ((byte)UNKNOWN.targetTypeValue))
|
|
||||||
return UNKNOWN;
|
|
||||||
|
|
||||||
if (tag < 0 || tag >= targets.length)
|
|
||||||
throw new IllegalArgumentException("Unknown TargetType: " + tag);
|
|
||||||
return targets[tag];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static enum TargetAttribute {
|
|
||||||
HasLocation, HasParameter, HasBound;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,56 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved.
|
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
||||||
*
|
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms of the GNU General Public License version 2 only, as
|
|
||||||
* published by the Free Software Foundation. Oracle designates this
|
|
||||||
* particular file as subject to the "Classpath" exception as provided
|
|
||||||
* by Oracle in the LICENSE file that accompanied this code.
|
|
||||||
*
|
|
||||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
* version 2 for more details (a copy is included in the LICENSE file that
|
|
||||||
* accompanied this code).
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License version
|
|
||||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
||||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
*
|
|
||||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
||||||
* or visit www.oracle.com if you need additional information or have any
|
|
||||||
* questions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.sun.tools.classfile;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* See JSR 308 specification, section 4.1
|
|
||||||
*
|
|
||||||
* <p><b>This is NOT part of any supported API.
|
|
||||||
* If you write code that depends on this, you do so at your own risk.
|
|
||||||
* This code and its internal interfaces are subject to change or
|
|
||||||
* deletion without notice.</b>
|
|
||||||
*/
|
|
||||||
public class RuntimeInvisibleTypeAnnotations_attribute extends RuntimeTypeAnnotations_attribute {
|
|
||||||
RuntimeInvisibleTypeAnnotations_attribute(ClassReader cr, int name_index, int length)
|
|
||||||
throws IOException, Annotation.InvalidAnnotation {
|
|
||||||
super(cr, name_index, length);
|
|
||||||
}
|
|
||||||
|
|
||||||
public RuntimeInvisibleTypeAnnotations_attribute(ConstantPool cp, ExtendedAnnotation[] annotations)
|
|
||||||
throws ConstantPoolException {
|
|
||||||
this(cp.getUTF8Index(Attribute.RuntimeInvisibleTypeAnnotations), annotations);
|
|
||||||
}
|
|
||||||
|
|
||||||
public RuntimeInvisibleTypeAnnotations_attribute(int name_index, ExtendedAnnotation[] annotations) {
|
|
||||||
super(name_index, annotations);
|
|
||||||
}
|
|
||||||
|
|
||||||
public <R, P> R accept(Visitor<R, P> visitor, P p) {
|
|
||||||
return visitor.visitRuntimeInvisibleTypeAnnotations(this, p);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,61 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved.
|
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
||||||
*
|
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms of the GNU General Public License version 2 only, as
|
|
||||||
* published by the Free Software Foundation. Oracle designates this
|
|
||||||
* particular file as subject to the "Classpath" exception as provided
|
|
||||||
* by Oracle in the LICENSE file that accompanied this code.
|
|
||||||
*
|
|
||||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
* version 2 for more details (a copy is included in the LICENSE file that
|
|
||||||
* accompanied this code).
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License version
|
|
||||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
||||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
*
|
|
||||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
||||||
* or visit www.oracle.com if you need additional information or have any
|
|
||||||
* questions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.sun.tools.classfile;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* See JSR 308 specification, section 4
|
|
||||||
*
|
|
||||||
* <p><b>This is NOT part of any supported API.
|
|
||||||
* If you write code that depends on this, you do so at your own risk.
|
|
||||||
* This code and its internal interfaces are subject to change or
|
|
||||||
* deletion without notice.</b>
|
|
||||||
*/
|
|
||||||
public abstract class RuntimeTypeAnnotations_attribute extends Attribute {
|
|
||||||
protected RuntimeTypeAnnotations_attribute(ClassReader cr, int name_index, int length)
|
|
||||||
throws IOException, Annotation.InvalidAnnotation {
|
|
||||||
super(name_index, length);
|
|
||||||
int num_annotations = cr.readUnsignedShort();
|
|
||||||
annotations = new ExtendedAnnotation[num_annotations];
|
|
||||||
for (int i = 0; i < annotations.length; i++)
|
|
||||||
annotations[i] = new ExtendedAnnotation(cr);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected RuntimeTypeAnnotations_attribute(int name_index, ExtendedAnnotation[] annotations) {
|
|
||||||
super(name_index, length(annotations));
|
|
||||||
this.annotations = annotations;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static int length(ExtendedAnnotation[] annos) {
|
|
||||||
int n = 2;
|
|
||||||
for (ExtendedAnnotation anno: annos)
|
|
||||||
n += anno.length();
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final ExtendedAnnotation[] annotations;
|
|
||||||
}
|
|
|
@ -1,56 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved.
|
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
||||||
*
|
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms of the GNU General Public License version 2 only, as
|
|
||||||
* published by the Free Software Foundation. Oracle designates this
|
|
||||||
* particular file as subject to the "Classpath" exception as provided
|
|
||||||
* by Oracle in the LICENSE file that accompanied this code.
|
|
||||||
*
|
|
||||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
* version 2 for more details (a copy is included in the LICENSE file that
|
|
||||||
* accompanied this code).
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License version
|
|
||||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
||||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
*
|
|
||||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
||||||
* or visit www.oracle.com if you need additional information or have any
|
|
||||||
* questions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.sun.tools.classfile;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* See JSR 308 specification, section 4.1
|
|
||||||
*
|
|
||||||
* <p><b>This is NOT part of any supported API.
|
|
||||||
* If you write code that depends on this, you do so at your own risk.
|
|
||||||
* This code and its internal interfaces are subject to change or
|
|
||||||
* deletion without notice.</b>
|
|
||||||
*/
|
|
||||||
public class RuntimeVisibleTypeAnnotations_attribute extends RuntimeTypeAnnotations_attribute {
|
|
||||||
RuntimeVisibleTypeAnnotations_attribute(ClassReader cr, int name_index, int length)
|
|
||||||
throws IOException, Annotation.InvalidAnnotation {
|
|
||||||
super(cr, name_index, length);
|
|
||||||
}
|
|
||||||
|
|
||||||
public RuntimeVisibleTypeAnnotations_attribute(ConstantPool cp, ExtendedAnnotation[] annotations)
|
|
||||||
throws ConstantPoolException {
|
|
||||||
this(cp.getUTF8Index(Attribute.RuntimeVisibleTypeAnnotations), annotations);
|
|
||||||
}
|
|
||||||
|
|
||||||
public RuntimeVisibleTypeAnnotations_attribute(int name_index, ExtendedAnnotation[] annotations) {
|
|
||||||
super(name_index, annotations);
|
|
||||||
}
|
|
||||||
|
|
||||||
public <R, P> R accept(Visitor<R, P> visitor, P p) {
|
|
||||||
return visitor.visitRuntimeVisibleTypeAnnotations(this, p);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -204,21 +204,6 @@ public abstract class Attribute implements AnnotationValue {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class TypeCompound extends Compound {
|
|
||||||
public TypeAnnotationPosition position;
|
|
||||||
public TypeCompound(Compound compound,
|
|
||||||
TypeAnnotationPosition position) {
|
|
||||||
this(compound.type, compound.values, position);
|
|
||||||
}
|
|
||||||
public TypeCompound(Type type,
|
|
||||||
List<Pair<MethodSymbol, Attribute>> values,
|
|
||||||
TypeAnnotationPosition position) {
|
|
||||||
super(type, values);
|
|
||||||
this.position = position;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/** The value for an annotation element of an array type.
|
/** The value for an annotation element of an array type.
|
||||||
*/
|
*/
|
||||||
public static class Array extends Attribute {
|
public static class Array extends Attribute {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -100,17 +100,6 @@ public abstract class Symbol implements Element {
|
||||||
*/
|
*/
|
||||||
public Type type;
|
public Type type;
|
||||||
|
|
||||||
/** The type annotations targeted to a tree directly owned by this symbol
|
|
||||||
*/
|
|
||||||
// type annotations are stored here for two purposes:
|
|
||||||
// - convenient location to store annotations for generation after erasure
|
|
||||||
// - a private interface for accessing type annotations parsed from
|
|
||||||
// classfiles
|
|
||||||
// the field is populated for the following declaration only
|
|
||||||
// class, field, variable and type parameters
|
|
||||||
//
|
|
||||||
public List<Attribute.TypeCompound> typeAnnotations;
|
|
||||||
|
|
||||||
/** The owner of this symbol.
|
/** The owner of this symbol.
|
||||||
*/
|
*/
|
||||||
public Symbol owner;
|
public Symbol owner;
|
||||||
|
@ -133,7 +122,6 @@ public abstract class Symbol implements Element {
|
||||||
this.completer = null;
|
this.completer = null;
|
||||||
this.erasure_field = null;
|
this.erasure_field = null;
|
||||||
this.attributes_field = List.nil();
|
this.attributes_field = List.nil();
|
||||||
this.typeAnnotations = List.nil();
|
|
||||||
this.name = name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,403 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
|
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
||||||
*
|
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms of the GNU General Public License version 2 only, as
|
|
||||||
* published by the Free Software Foundation. Oracle designates this
|
|
||||||
* particular file as subject to the "Classpath" exception as provided
|
|
||||||
* by Oracle in the LICENSE file that accompanied this code.
|
|
||||||
*
|
|
||||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
* version 2 for more details (a copy is included in the LICENSE file that
|
|
||||||
* accompanied this code).
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License version
|
|
||||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
||||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
*
|
|
||||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
||||||
* or visit www.oracle.com if you need additional information or have any
|
|
||||||
* questions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.sun.tools.javac.code;
|
|
||||||
|
|
||||||
import javax.lang.model.element.ElementKind;
|
|
||||||
|
|
||||||
import com.sun.tools.javac.code.Symbol.VarSymbol;
|
|
||||||
import com.sun.tools.javac.tree.JCTree;
|
|
||||||
import com.sun.tools.javac.tree.TreeInfo;
|
|
||||||
import com.sun.tools.javac.tree.TreeScanner;
|
|
||||||
import com.sun.tools.javac.tree.JCTree.*;
|
|
||||||
import com.sun.tools.javac.util.Context;
|
|
||||||
import com.sun.tools.javac.util.List;
|
|
||||||
import com.sun.tools.javac.util.ListBuffer;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Contains operations specific to processing type annotations
|
|
||||||
*/
|
|
||||||
public class TypeAnnotations {
|
|
||||||
private static final Context.Key<TypeAnnotations> key
|
|
||||||
= new Context.Key<TypeAnnotations>();
|
|
||||||
|
|
||||||
public static TypeAnnotations instance(Context context) {
|
|
||||||
TypeAnnotations instance = context.get(key);
|
|
||||||
if (instance == null)
|
|
||||||
instance = new TypeAnnotations(context);
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected TypeAnnotations(Context context) {
|
|
||||||
context.put(key, this);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void taFillAndLift(JCClassDecl tree, boolean visitBodies) {
|
|
||||||
//308 new TypeAnnotationPositions().scan(tree);
|
|
||||||
//308 new TypeAnnotationLift().scan(tree);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class TypeAnnotationPositions extends TreeScanner {
|
|
||||||
|
|
||||||
private ListBuffer<JCTree> frames = ListBuffer.lb();
|
|
||||||
private void push(JCTree t) { frames = frames.prepend(t); }
|
|
||||||
private JCTree pop() { return frames.next(); }
|
|
||||||
private JCTree peek2() { return frames.toList().tail.head; }
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void scan(JCTree tree) {
|
|
||||||
push(tree);
|
|
||||||
super.scan(tree);
|
|
||||||
pop();
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean inClass = false;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visitClassDef(JCClassDecl tree) {
|
|
||||||
if (!inClass) {
|
|
||||||
// Do not recurse into nested and inner classes since
|
|
||||||
// TransTypes.visitClassDef makes an invocation for each class
|
|
||||||
// separately.
|
|
||||||
inClass = true;
|
|
||||||
try {
|
|
||||||
super.visitClassDef(tree);
|
|
||||||
} finally {
|
|
||||||
inClass = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private TypeAnnotationPosition resolveFrame(JCTree tree, JCTree frame,
|
|
||||||
List<JCTree> path, TypeAnnotationPosition p) {
|
|
||||||
switch (frame.getKind()) {
|
|
||||||
case TYPE_CAST:
|
|
||||||
p.type = TargetType.TYPECAST;
|
|
||||||
p.pos = frame.pos;
|
|
||||||
return p;
|
|
||||||
|
|
||||||
case INSTANCE_OF:
|
|
||||||
p.type = TargetType.INSTANCEOF;
|
|
||||||
p.pos = frame.pos;
|
|
||||||
return p;
|
|
||||||
|
|
||||||
case NEW_CLASS:
|
|
||||||
p.type = TargetType.NEW;
|
|
||||||
p.pos = frame.pos;
|
|
||||||
return p;
|
|
||||||
|
|
||||||
case NEW_ARRAY:
|
|
||||||
p.type = TargetType.NEW;
|
|
||||||
p.pos = frame.pos;
|
|
||||||
return p;
|
|
||||||
|
|
||||||
case ANNOTATION_TYPE:
|
|
||||||
case CLASS:
|
|
||||||
case ENUM:
|
|
||||||
case INTERFACE:
|
|
||||||
p.pos = frame.pos;
|
|
||||||
if (((JCClassDecl)frame).extending == tree) {
|
|
||||||
p.type = TargetType.CLASS_EXTENDS;
|
|
||||||
p.type_index = -1;
|
|
||||||
} else if (((JCClassDecl)frame).implementing.contains(tree)) {
|
|
||||||
p.type = TargetType.CLASS_EXTENDS;
|
|
||||||
p.type_index = ((JCClassDecl)frame).implementing.indexOf(tree);
|
|
||||||
} else if (((JCClassDecl)frame).typarams.contains(tree)) {
|
|
||||||
p.type = TargetType.CLASS_TYPE_PARAMETER;
|
|
||||||
p.parameter_index = ((JCClassDecl)frame).typarams.indexOf(tree);
|
|
||||||
} else
|
|
||||||
throw new AssertionError();
|
|
||||||
return p;
|
|
||||||
|
|
||||||
case METHOD: {
|
|
||||||
JCMethodDecl frameMethod = (JCMethodDecl)frame;
|
|
||||||
p.pos = frame.pos;
|
|
||||||
if (frameMethod.receiverAnnotations.contains(tree))
|
|
||||||
p.type = TargetType.METHOD_RECEIVER;
|
|
||||||
else if (frameMethod.thrown.contains(tree)) {
|
|
||||||
p.type = TargetType.THROWS;
|
|
||||||
p.type_index = frameMethod.thrown.indexOf(tree);
|
|
||||||
} else if (((JCMethodDecl)frame).restype == tree) {
|
|
||||||
p.type = TargetType.METHOD_RETURN_GENERIC_OR_ARRAY;
|
|
||||||
} else if (frameMethod.typarams.contains(tree)) {
|
|
||||||
p.type = TargetType.METHOD_TYPE_PARAMETER;
|
|
||||||
p.parameter_index = frameMethod.typarams.indexOf(tree);
|
|
||||||
} else
|
|
||||||
throw new AssertionError();
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
case MEMBER_SELECT: {
|
|
||||||
JCFieldAccess fieldFrame = (JCFieldAccess)frame;
|
|
||||||
if ("class".contentEquals(fieldFrame.name)) {
|
|
||||||
p.type = TargetType.CLASS_LITERAL;
|
|
||||||
p.pos = TreeInfo.innermostType(fieldFrame.selected).pos;
|
|
||||||
} else
|
|
||||||
throw new AssertionError();
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
case PARAMETERIZED_TYPE: {
|
|
||||||
TypeAnnotationPosition nextP;
|
|
||||||
if (((JCTypeApply)frame).clazz == tree)
|
|
||||||
nextP = p; // generic: RAW; noop
|
|
||||||
else if (((JCTypeApply)frame).arguments.contains(tree))
|
|
||||||
p.location = p.location.prepend(
|
|
||||||
((JCTypeApply)frame).arguments.indexOf(tree));
|
|
||||||
else
|
|
||||||
throw new AssertionError();
|
|
||||||
|
|
||||||
List<JCTree> newPath = path.tail;
|
|
||||||
return resolveFrame(newPath.head, newPath.tail.head, newPath, p);
|
|
||||||
}
|
|
||||||
|
|
||||||
case ARRAY_TYPE: {
|
|
||||||
p.location = p.location.prepend(0);
|
|
||||||
List<JCTree> newPath = path.tail;
|
|
||||||
return resolveFrame(newPath.head, newPath.tail.head, newPath, p);
|
|
||||||
}
|
|
||||||
|
|
||||||
case TYPE_PARAMETER:
|
|
||||||
if (path.tail.tail.head.getTag() == JCTree.CLASSDEF) {
|
|
||||||
JCClassDecl clazz = (JCClassDecl)path.tail.tail.head;
|
|
||||||
p.type = TargetType.CLASS_TYPE_PARAMETER_BOUND;
|
|
||||||
p.parameter_index = clazz.typarams.indexOf(path.tail.head);
|
|
||||||
p.bound_index = ((JCTypeParameter)frame).bounds.indexOf(tree);
|
|
||||||
} else if (path.tail.tail.head.getTag() == JCTree.METHODDEF) {
|
|
||||||
JCMethodDecl method = (JCMethodDecl)path.tail.tail.head;
|
|
||||||
p.type = TargetType.METHOD_TYPE_PARAMETER_BOUND;
|
|
||||||
p.parameter_index = method.typarams.indexOf(path.tail.head);
|
|
||||||
p.bound_index = ((JCTypeParameter)frame).bounds.indexOf(tree);
|
|
||||||
} else
|
|
||||||
throw new AssertionError();
|
|
||||||
p.pos = frame.pos;
|
|
||||||
return p;
|
|
||||||
|
|
||||||
case VARIABLE:
|
|
||||||
VarSymbol v = ((JCVariableDecl)frame).sym;
|
|
||||||
p.pos = frame.pos;
|
|
||||||
switch (v.getKind()) {
|
|
||||||
case LOCAL_VARIABLE:
|
|
||||||
p.type = TargetType.LOCAL_VARIABLE; break;
|
|
||||||
case FIELD:
|
|
||||||
p.type = TargetType.FIELD_GENERIC_OR_ARRAY; break;
|
|
||||||
case PARAMETER:
|
|
||||||
p.type = TargetType.METHOD_PARAMETER_GENERIC_OR_ARRAY;
|
|
||||||
p.parameter_index = methodParamIndex(path, frame);
|
|
||||||
break;
|
|
||||||
default: throw new AssertionError();
|
|
||||||
}
|
|
||||||
return p;
|
|
||||||
|
|
||||||
//308 case ANNOTATED_TYPE: {
|
|
||||||
//308 List<JCTree> newPath = path.tail;
|
|
||||||
//308 return resolveFrame(newPath.head, newPath.tail.head,
|
|
||||||
//308 newPath, p);
|
|
||||||
//308 }
|
|
||||||
|
|
||||||
case METHOD_INVOCATION: {
|
|
||||||
JCMethodInvocation invocation = (JCMethodInvocation)frame;
|
|
||||||
if (!invocation.typeargs.contains(tree))
|
|
||||||
throw new AssertionError("{" + tree + "} is not an argument in the invocation: " + invocation);
|
|
||||||
p.type = TargetType.METHOD_TYPE_ARGUMENT;
|
|
||||||
p.pos = invocation.pos;
|
|
||||||
p.type_index = invocation.typeargs.indexOf(tree);
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
case EXTENDS_WILDCARD:
|
|
||||||
case SUPER_WILDCARD: {
|
|
||||||
p.type = TargetType.WILDCARD_BOUND;
|
|
||||||
List<JCTree> newPath = path.tail;
|
|
||||||
|
|
||||||
TypeAnnotationPosition wildcard =
|
|
||||||
resolveFrame(newPath.head, newPath.tail.head, newPath,
|
|
||||||
new TypeAnnotationPosition());
|
|
||||||
if (!wildcard.location.isEmpty())
|
|
||||||
wildcard.type = wildcard.type.getGenericComplement();
|
|
||||||
p.wildcard_position = wildcard;
|
|
||||||
p.pos = frame.pos;
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setTypeAnnotationPos(List<JCTypeAnnotation> annotations, TypeAnnotationPosition position) {
|
|
||||||
for (JCTypeAnnotation anno : annotations) {
|
|
||||||
anno.annotation_position = position;
|
|
||||||
anno.attribute_field.position = position;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visitNewArray(JCNewArray tree) {
|
|
||||||
findPosition(tree, tree, tree.annotations);
|
|
||||||
int dimAnnosCount = tree.dimAnnotations.size();
|
|
||||||
|
|
||||||
// handle annotations associated with dimentions
|
|
||||||
for (int i = 0; i < dimAnnosCount; ++i) {
|
|
||||||
TypeAnnotationPosition p = new TypeAnnotationPosition();
|
|
||||||
p.type = TargetType.NEW_GENERIC_OR_ARRAY;
|
|
||||||
p.pos = tree.pos;
|
|
||||||
p.location = p.location.append(i);
|
|
||||||
setTypeAnnotationPos(tree.dimAnnotations.get(i), p);
|
|
||||||
}
|
|
||||||
|
|
||||||
// handle "free" annotations
|
|
||||||
int i = dimAnnosCount == 0 ? 0 : dimAnnosCount - 1;
|
|
||||||
JCExpression elemType = tree.elemtype;
|
|
||||||
while (elemType != null) {
|
|
||||||
if (elemType.getTag() == JCTree.ANNOTATED_TYPE) {
|
|
||||||
JCAnnotatedType at = (JCAnnotatedType)elemType;
|
|
||||||
TypeAnnotationPosition p = new TypeAnnotationPosition();
|
|
||||||
p.type = TargetType.NEW_GENERIC_OR_ARRAY;
|
|
||||||
p.pos = tree.pos;
|
|
||||||
p.location = p.location.append(i);
|
|
||||||
setTypeAnnotationPos(at.annotations, p);
|
|
||||||
elemType = at.underlyingType;
|
|
||||||
} else if (elemType.getTag() == JCTree.TYPEARRAY) {
|
|
||||||
++i;
|
|
||||||
elemType = ((JCArrayTypeTree)elemType).elemtype;
|
|
||||||
} else
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// find annotations locations of initializer elements
|
|
||||||
scan(tree.elems);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visitAnnotatedType(JCAnnotatedType tree) {
|
|
||||||
findPosition(tree, peek2(), tree.annotations);
|
|
||||||
super.visitAnnotatedType(tree);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visitMethodDef(JCMethodDecl tree) {
|
|
||||||
TypeAnnotationPosition p = new TypeAnnotationPosition();
|
|
||||||
p.type = TargetType.METHOD_RECEIVER;
|
|
||||||
setTypeAnnotationPos(tree.receiverAnnotations, p);
|
|
||||||
super.visitMethodDef(tree);
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public void visitTypeParameter(JCTypeParameter tree) {
|
|
||||||
findPosition(tree, peek2(), tree.annotations);
|
|
||||||
super.visitTypeParameter(tree);
|
|
||||||
}
|
|
||||||
|
|
||||||
void findPosition(JCTree tree, JCTree frame, List<JCTypeAnnotation> annotations) {
|
|
||||||
if (!annotations.isEmpty()) {
|
|
||||||
TypeAnnotationPosition p =
|
|
||||||
resolveFrame(tree, frame, frames.toList(),
|
|
||||||
new TypeAnnotationPosition());
|
|
||||||
if (!p.location.isEmpty())
|
|
||||||
p.type = p.type.getGenericComplement();
|
|
||||||
setTypeAnnotationPos(annotations, p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private int methodParamIndex(List<JCTree> path, JCTree param) {
|
|
||||||
List<JCTree> curr = path;
|
|
||||||
if (curr.head != param)
|
|
||||||
curr = path.tail;
|
|
||||||
JCMethodDecl method = (JCMethodDecl)curr.tail.head;
|
|
||||||
return method.params.indexOf(param);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class TypeAnnotationLift extends TreeScanner {
|
|
||||||
List<Attribute.TypeCompound> recordedTypeAnnotations = List.nil();
|
|
||||||
|
|
||||||
boolean isInner = false;
|
|
||||||
@Override
|
|
||||||
public void visitClassDef(JCClassDecl tree) {
|
|
||||||
if (isInner) {
|
|
||||||
// tree is an inner class tree. stop now.
|
|
||||||
// TransTypes.visitClassDef makes an invocation for each class
|
|
||||||
// separately.
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
isInner = true;
|
|
||||||
List<Attribute.TypeCompound> prevTAs = recordedTypeAnnotations;
|
|
||||||
recordedTypeAnnotations = List.nil();
|
|
||||||
try {
|
|
||||||
super.visitClassDef(tree);
|
|
||||||
} finally {
|
|
||||||
tree.sym.typeAnnotations = tree.sym.typeAnnotations.appendList(recordedTypeAnnotations);
|
|
||||||
recordedTypeAnnotations = prevTAs;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visitMethodDef(JCMethodDecl tree) {
|
|
||||||
List<Attribute.TypeCompound> prevTAs = recordedTypeAnnotations;
|
|
||||||
recordedTypeAnnotations = List.nil();
|
|
||||||
try {
|
|
||||||
super.visitMethodDef(tree);
|
|
||||||
} finally {
|
|
||||||
tree.sym.typeAnnotations = tree.sym.typeAnnotations.appendList(recordedTypeAnnotations);
|
|
||||||
recordedTypeAnnotations = prevTAs;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visitVarDef(JCVariableDecl tree) {
|
|
||||||
List<Attribute.TypeCompound> prevTAs = recordedTypeAnnotations;
|
|
||||||
recordedTypeAnnotations = List.nil();
|
|
||||||
ElementKind kind = tree.sym.getKind();
|
|
||||||
if (kind == ElementKind.LOCAL_VARIABLE && tree.mods.annotations.nonEmpty()) {
|
|
||||||
// need to lift the annotations
|
|
||||||
TypeAnnotationPosition position = new TypeAnnotationPosition();
|
|
||||||
position.pos = tree.pos;
|
|
||||||
position.type = TargetType.LOCAL_VARIABLE;
|
|
||||||
for (Attribute.Compound attribute : tree.sym.attributes_field) {
|
|
||||||
Attribute.TypeCompound tc =
|
|
||||||
new Attribute.TypeCompound(attribute.type, attribute.values, position);
|
|
||||||
recordedTypeAnnotations = recordedTypeAnnotations.append(tc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
super.visitVarDef(tree);
|
|
||||||
} finally {
|
|
||||||
if (kind.isField() || kind == ElementKind.LOCAL_VARIABLE)
|
|
||||||
tree.sym.typeAnnotations = tree.sym.typeAnnotations.appendList(recordedTypeAnnotations);
|
|
||||||
recordedTypeAnnotations = kind.isField() ? prevTAs : prevTAs.appendList(recordedTypeAnnotations);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visitApply(JCMethodInvocation tree) {
|
|
||||||
scan(tree.meth);
|
|
||||||
scan(tree.typeargs);
|
|
||||||
scan(tree.args);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void visitAnnotation(JCAnnotation tree) {
|
|
||||||
if (tree instanceof JCTypeAnnotation)
|
|
||||||
recordedTypeAnnotations = recordedTypeAnnotations.append(((JCTypeAnnotation)tree).attribute_field);
|
|
||||||
super.visitAnnotation(tree);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -2989,10 +2989,6 @@ public class Attr extends JCTree.Visitor {
|
||||||
result = tree.type = syms.errType;
|
result = tree.type = syms.errType;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void visitAnnotatedType(JCAnnotatedType tree) {
|
|
||||||
result = tree.type = attribType(tree.getUnderlyingType(), env);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void visitErroneous(JCErroneous tree) {
|
public void visitErroneous(JCErroneous tree) {
|
||||||
if (tree.errs != null)
|
if (tree.errs != null)
|
||||||
for (JCTree err : tree.errs)
|
for (JCTree err : tree.errs)
|
||||||
|
@ -3184,9 +3180,6 @@ public class Attr extends JCTree.Visitor {
|
||||||
(c.flags() & ABSTRACT) == 0) {
|
(c.flags() & ABSTRACT) == 0) {
|
||||||
checkSerialVersionUID(tree, c);
|
checkSerialVersionUID(tree, c);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check type annotations applicability rules
|
|
||||||
validateTypeAnnotations(tree);
|
|
||||||
}
|
}
|
||||||
// where
|
// where
|
||||||
/** check if a class is a subtype of Serializable, if that is available. */
|
/** check if a class is a subtype of Serializable, if that is available. */
|
||||||
|
@ -3234,35 +3227,6 @@ public class Attr extends JCTree.Visitor {
|
||||||
return types.capture(type);
|
return types.capture(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void validateTypeAnnotations(JCTree tree) {
|
|
||||||
tree.accept(typeAnnotationsValidator);
|
|
||||||
}
|
|
||||||
//where
|
|
||||||
private final JCTree.Visitor typeAnnotationsValidator =
|
|
||||||
new TreeScanner() {
|
|
||||||
public void visitAnnotation(JCAnnotation tree) {
|
|
||||||
if (tree instanceof JCTypeAnnotation) {
|
|
||||||
chk.validateTypeAnnotation((JCTypeAnnotation)tree, false);
|
|
||||||
}
|
|
||||||
super.visitAnnotation(tree);
|
|
||||||
}
|
|
||||||
public void visitTypeParameter(JCTypeParameter tree) {
|
|
||||||
chk.validateTypeAnnotations(tree.annotations, true);
|
|
||||||
// don't call super. skip type annotations
|
|
||||||
scan(tree.bounds);
|
|
||||||
}
|
|
||||||
public void visitMethodDef(JCMethodDecl tree) {
|
|
||||||
// need to check static methods
|
|
||||||
if ((tree.sym.flags() & Flags.STATIC) != 0) {
|
|
||||||
for (JCTypeAnnotation a : tree.receiverAnnotations) {
|
|
||||||
if (chk.isTypeAnnotation(a, false))
|
|
||||||
log.error(a.pos(), "annotation.type.not.applicable");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
super.visitMethodDef(tree);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// <editor-fold desc="post-attribution visitor">
|
// <editor-fold desc="post-attribution visitor">
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -1086,11 +1086,6 @@ public class Check {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visitAnnotatedType(JCAnnotatedType tree) {
|
|
||||||
tree.underlyingType.accept(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Default visitor method: do nothing.
|
/** Default visitor method: do nothing.
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
|
@ -2239,14 +2234,6 @@ public class Check {
|
||||||
validateAnnotation(a, s);
|
validateAnnotation(a, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Check the type annotations
|
|
||||||
*/
|
|
||||||
public void validateTypeAnnotations(List<JCTypeAnnotation> annotations, boolean isTypeParameter) {
|
|
||||||
if (skipAnnotations) return;
|
|
||||||
for (JCTypeAnnotation a : annotations)
|
|
||||||
validateTypeAnnotation(a, isTypeParameter);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Check an annotation of a symbol.
|
/** Check an annotation of a symbol.
|
||||||
*/
|
*/
|
||||||
public void validateAnnotation(JCAnnotation a, Symbol s) {
|
public void validateAnnotation(JCAnnotation a, Symbol s) {
|
||||||
|
@ -2261,15 +2248,6 @@ public class Check {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void validateTypeAnnotation(JCTypeAnnotation a, boolean isTypeParameter) {
|
|
||||||
if (a.type == null)
|
|
||||||
throw new AssertionError("annotation tree hasn't been attributed yet: " + a);
|
|
||||||
validateAnnotationTree(a);
|
|
||||||
|
|
||||||
if (!isTypeAnnotation(a, isTypeParameter))
|
|
||||||
log.error(a.pos(), "annotation.type.not.applicable");
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Is s a method symbol that overrides a method in a superclass? */
|
/** Is s a method symbol that overrides a method in a superclass? */
|
||||||
boolean isOverrider(Symbol s) {
|
boolean isOverrider(Symbol s) {
|
||||||
if (s.kind != MTH || s.isStatic())
|
if (s.kind != MTH || s.isStatic())
|
||||||
|
@ -2288,25 +2266,6 @@ public class Check {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Is the annotation applicable to type annotations */
|
|
||||||
boolean isTypeAnnotation(JCTypeAnnotation a, boolean isTypeParameter) {
|
|
||||||
Attribute.Compound atTarget =
|
|
||||||
a.annotationType.type.tsym.attribute(syms.annotationTargetType.tsym);
|
|
||||||
if (atTarget == null) return true;
|
|
||||||
Attribute atValue = atTarget.member(names.value);
|
|
||||||
if (!(atValue instanceof Attribute.Array)) return true; // error recovery
|
|
||||||
Attribute.Array arr = (Attribute.Array) atValue;
|
|
||||||
for (Attribute app : arr.values) {
|
|
||||||
if (!(app instanceof Attribute.Enum)) return true; // recovery
|
|
||||||
Attribute.Enum e = (Attribute.Enum) app;
|
|
||||||
if (!isTypeParameter && e.value.name == names.TYPE_USE)
|
|
||||||
return true;
|
|
||||||
else if (isTypeParameter && e.value.name == names.TYPE_PARAMETER)
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Is the annotation applicable to the symbol? */
|
/** Is the annotation applicable to the symbol? */
|
||||||
boolean annotationApplicable(JCAnnotation a, Symbol s) {
|
boolean annotationApplicable(JCAnnotation a, Symbol s) {
|
||||||
Attribute.Compound atTarget =
|
Attribute.Compound atTarget =
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -37,7 +37,6 @@ import com.sun.tools.javac.util.*;
|
||||||
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
|
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
|
||||||
|
|
||||||
import com.sun.tools.javac.code.Symbol.*;
|
import com.sun.tools.javac.code.Symbol.*;
|
||||||
import com.sun.tools.javac.comp.Resolve;
|
|
||||||
import com.sun.tools.javac.tree.JCTree.*;
|
import com.sun.tools.javac.tree.JCTree.*;
|
||||||
|
|
||||||
import static com.sun.tools.javac.code.Flags.*;
|
import static com.sun.tools.javac.code.Flags.*;
|
||||||
|
@ -1350,11 +1349,6 @@ public class Flow extends TreeScanner {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void visitAnnotatedType(JCAnnotatedType tree) {
|
|
||||||
// annotations don't get scanned
|
|
||||||
tree.underlyingType.accept(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void visitIdent(JCIdent tree) {
|
public void visitIdent(JCIdent tree) {
|
||||||
if (tree.sym.kind == VAR) {
|
if (tree.sym.kind == VAR) {
|
||||||
checkInit(tree.pos(), (VarSymbol)tree.sym);
|
checkInit(tree.pos(), (VarSymbol)tree.sym);
|
||||||
|
@ -1373,7 +1367,6 @@ public class Flow extends TreeScanner {
|
||||||
if (!tree.type.isErroneous()
|
if (!tree.type.isErroneous()
|
||||||
&& lint.isEnabled(Lint.LintCategory.CAST)
|
&& lint.isEnabled(Lint.LintCategory.CAST)
|
||||||
&& types.isSameType(tree.expr.type, tree.clazz.type)
|
&& types.isSameType(tree.expr.type, tree.clazz.type)
|
||||||
&& !(ignoreAnnotatedCasts && containsTypeAnnotation(tree.clazz))
|
|
||||||
&& !is292targetTypeCast(tree)) {
|
&& !is292targetTypeCast(tree)) {
|
||||||
log.warning(Lint.LintCategory.CAST,
|
log.warning(Lint.LintCategory.CAST,
|
||||||
tree.pos(), "redundant.cast", tree.expr.type);
|
tree.pos(), "redundant.cast", tree.expr.type);
|
||||||
|
@ -1396,23 +1389,6 @@ public class Flow extends TreeScanner {
|
||||||
// Do nothing for TopLevel since each class is visited individually
|
// Do nothing for TopLevel since each class is visited individually
|
||||||
}
|
}
|
||||||
|
|
||||||
/**************************************************************************
|
|
||||||
* utility methods for ignoring type-annotated casts lint checking
|
|
||||||
*************************************************************************/
|
|
||||||
private static final boolean ignoreAnnotatedCasts = true;
|
|
||||||
private static class AnnotationFinder extends TreeScanner {
|
|
||||||
public boolean foundTypeAnno = false;
|
|
||||||
public void visitAnnotation(JCAnnotation tree) {
|
|
||||||
foundTypeAnno = foundTypeAnno || (tree instanceof JCTypeAnnotation);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean containsTypeAnnotation(JCTree e) {
|
|
||||||
AnnotationFinder finder = new AnnotationFinder();
|
|
||||||
finder.scan(e);
|
|
||||||
return finder.foundTypeAnno;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* main method
|
* main method
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -2585,11 +2585,6 @@ public class Lower extends TreeTranslator {
|
||||||
result = tree;
|
result = tree;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void visitAnnotatedType(JCAnnotatedType tree) {
|
|
||||||
tree.underlyingType = translate(tree.underlyingType);
|
|
||||||
result = tree.underlyingType;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void visitTypeCast(JCTypeCast tree) {
|
public void visitTypeCast(JCTypeCast tree) {
|
||||||
tree.clazz = translate(tree.clazz);
|
tree.clazz = translate(tree.clazz);
|
||||||
if (tree.type.isPrimitive() != tree.expr.type.isPrimitive())
|
if (tree.type.isPrimitive() != tree.expr.type.isPrimitive())
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -928,10 +928,6 @@ public class MemberEnter extends JCTree.Visitor implements Completer {
|
||||||
if (hasDeprecatedAnnotation(tree.mods.annotations))
|
if (hasDeprecatedAnnotation(tree.mods.annotations))
|
||||||
c.flags_field |= DEPRECATED;
|
c.flags_field |= DEPRECATED;
|
||||||
annotateLater(tree.mods.annotations, baseEnv, c);
|
annotateLater(tree.mods.annotations, baseEnv, c);
|
||||||
// class type parameters use baseEnv but everything uses env
|
|
||||||
for (JCTypeParameter tp : tree.typarams)
|
|
||||||
tp.accept(new TypeAnnotate(baseEnv));
|
|
||||||
tree.accept(new TypeAnnotate(env));
|
|
||||||
|
|
||||||
chk.checkNonCyclicDecl(tree);
|
chk.checkNonCyclicDecl(tree);
|
||||||
|
|
||||||
|
@ -1014,86 +1010,6 @@ public class MemberEnter extends JCTree.Visitor implements Completer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// A sub-phase that "compiles" annotations in annotated types.
|
|
||||||
private class TypeAnnotate extends TreeScanner {
|
|
||||||
private Env<AttrContext> env;
|
|
||||||
public TypeAnnotate(Env<AttrContext> env) { this.env = env; }
|
|
||||||
|
|
||||||
private void enterTypeAnnotations(List<JCTypeAnnotation> annotations) {
|
|
||||||
Set<TypeSymbol> annotated = new HashSet<TypeSymbol>();
|
|
||||||
if (!skipAnnotations)
|
|
||||||
for (List<JCTypeAnnotation> al = annotations; al.nonEmpty(); al = al.tail) {
|
|
||||||
JCTypeAnnotation a = al.head;
|
|
||||||
Attribute.Compound c = annotate.enterAnnotation(a,
|
|
||||||
syms.annotationType,
|
|
||||||
env);
|
|
||||||
if (c == null) continue;
|
|
||||||
Attribute.TypeCompound tc = new Attribute.TypeCompound(c.type, c.values, a.annotation_position);
|
|
||||||
a.attribute_field = tc;
|
|
||||||
// Note: @Deprecated has no effect on local variables and parameters
|
|
||||||
if (!annotated.add(a.type.tsym))
|
|
||||||
log.error(a.pos, "duplicate.annotation");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// each class (including enclosed inner classes) should be visited
|
|
||||||
// separately through MemberEnter.complete(Symbol)
|
|
||||||
// this flag is used to prevent from visiting inner classes.
|
|
||||||
private boolean isEnclosingClass = false;
|
|
||||||
@Override
|
|
||||||
public void visitClassDef(final JCClassDecl tree) {
|
|
||||||
if (isEnclosingClass)
|
|
||||||
return;
|
|
||||||
isEnclosingClass = true;
|
|
||||||
scan(tree.mods);
|
|
||||||
// type parameter need to be visited with a separate env
|
|
||||||
// scan(tree.typarams);
|
|
||||||
scan(tree.extending);
|
|
||||||
scan(tree.implementing);
|
|
||||||
scan(tree.defs);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void annotate(final JCTree tree, final List<JCTypeAnnotation> annotations) {
|
|
||||||
annotate.later(new Annotate.Annotator() {
|
|
||||||
public String toString() {
|
|
||||||
return "annotate " + annotations + " onto " + tree;
|
|
||||||
}
|
|
||||||
public void enterAnnotation() {
|
|
||||||
JavaFileObject prev = log.useSource(env.toplevel.sourcefile);
|
|
||||||
try {
|
|
||||||
enterTypeAnnotations(annotations);
|
|
||||||
} finally {
|
|
||||||
log.useSource(prev);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visitAnnotatedType(final JCAnnotatedType tree) {
|
|
||||||
annotate(tree, tree.annotations);
|
|
||||||
super.visitAnnotatedType(tree);
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public void visitTypeParameter(final JCTypeParameter tree) {
|
|
||||||
annotate(tree, tree.annotations);
|
|
||||||
super.visitTypeParameter(tree);
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public void visitNewArray(final JCNewArray tree) {
|
|
||||||
annotate(tree, tree.annotations);
|
|
||||||
for (List<JCTypeAnnotation> dimAnnos : tree.dimAnnotations)
|
|
||||||
annotate(tree, dimAnnos);
|
|
||||||
super.visitNewArray(tree);
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public void visitMethodDef(JCMethodDecl tree) {
|
|
||||||
annotate(tree, tree.receiverAnnotations);
|
|
||||||
super.visitMethodDef(tree);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private Env<AttrContext> baseEnv(JCClassDecl tree, Env<AttrContext> env) {
|
private Env<AttrContext> baseEnv(JCClassDecl tree, Env<AttrContext> env) {
|
||||||
Scope baseScope = new Scope.ClassScope(tree.sym, scopeCounter);
|
Scope baseScope = new Scope.ClassScope(tree.sym, scopeCounter);
|
||||||
//import already entered local classes into base scope
|
//import already entered local classes into base scope
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -69,7 +69,6 @@ public class TransTypes extends TreeTranslator {
|
||||||
private boolean allowEnums;
|
private boolean allowEnums;
|
||||||
private Types types;
|
private Types types;
|
||||||
private final Resolve resolve;
|
private final Resolve resolve;
|
||||||
private final TypeAnnotations typeAnnotations;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Flag to indicate whether or not to generate bridge methods.
|
* Flag to indicate whether or not to generate bridge methods.
|
||||||
|
@ -91,7 +90,6 @@ public class TransTypes extends TreeTranslator {
|
||||||
types = Types.instance(context);
|
types = Types.instance(context);
|
||||||
make = TreeMaker.instance(context);
|
make = TreeMaker.instance(context);
|
||||||
resolve = Resolve.instance(context);
|
resolve = Resolve.instance(context);
|
||||||
typeAnnotations = TypeAnnotations.instance(context);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** A hashtable mapping bridge methods to the methods they override after
|
/** A hashtable mapping bridge methods to the methods they override after
|
||||||
|
@ -445,14 +443,12 @@ public class TransTypes extends TreeTranslator {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void visitClassDef(JCClassDecl tree) {
|
public void visitClassDef(JCClassDecl tree) {
|
||||||
typeAnnotations.taFillAndLift(tree, true);
|
|
||||||
translateClass(tree.sym);
|
translateClass(tree.sym);
|
||||||
result = tree;
|
result = tree;
|
||||||
}
|
}
|
||||||
|
|
||||||
JCMethodDecl currentMethod = null;
|
JCMethodDecl currentMethod = null;
|
||||||
public void visitMethodDef(JCMethodDecl tree) {
|
public void visitMethodDef(JCMethodDecl tree) {
|
||||||
tree.sym.typeAnnotations = tree.sym.typeAnnotations;
|
|
||||||
JCMethodDecl previousMethod = currentMethod;
|
JCMethodDecl previousMethod = currentMethod;
|
||||||
try {
|
try {
|
||||||
currentMethod = tree;
|
currentMethod = tree;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -207,10 +207,6 @@ public class ClassReader implements Completer {
|
||||||
/** The minor version number of the class file being read. */
|
/** The minor version number of the class file being read. */
|
||||||
int minorVersion;
|
int minorVersion;
|
||||||
|
|
||||||
/** Switch: debug output for JSR 308-related operations.
|
|
||||||
*/
|
|
||||||
boolean debugJSR308;
|
|
||||||
|
|
||||||
/** A table to hold the constant pool indices for method parameter
|
/** A table to hold the constant pool indices for method parameter
|
||||||
* names, as given in LocalVariableTable attributes.
|
* names, as given in LocalVariableTable attributes.
|
||||||
*/
|
*/
|
||||||
|
@ -297,7 +293,6 @@ public class ClassReader implements Completer {
|
||||||
: null;
|
: null;
|
||||||
|
|
||||||
typevars = new Scope(syms.noSymbol);
|
typevars = new Scope(syms.noSymbol);
|
||||||
debugJSR308 = options.isSet("TA:reader");
|
|
||||||
|
|
||||||
lintClassfile = Lint.instance(context).isEnabled(LintCategory.CLASSFILE);
|
lintClassfile = Lint.instance(context).isEnabled(LintCategory.CLASSFILE);
|
||||||
|
|
||||||
|
@ -1128,20 +1123,6 @@ public class ClassReader implements Completer {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
// v51 attributes
|
|
||||||
new AttributeReader(names.RuntimeVisibleTypeAnnotations, V51, CLASS_OR_MEMBER_ATTRIBUTE) {
|
|
||||||
void read(Symbol sym, int attrLen) {
|
|
||||||
attachTypeAnnotations(sym);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
new AttributeReader(names.RuntimeInvisibleTypeAnnotations, V51, CLASS_OR_MEMBER_ATTRIBUTE) {
|
|
||||||
void read(Symbol sym, int attrLen) {
|
|
||||||
attachTypeAnnotations(sym);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
// The following attributes for a Code attribute are not currently handled
|
// The following attributes for a Code attribute are not currently handled
|
||||||
// StackMapTable
|
// StackMapTable
|
||||||
// SourceDebugExtension
|
// SourceDebugExtension
|
||||||
|
@ -1351,17 +1332,6 @@ public class ClassReader implements Completer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void attachTypeAnnotations(final Symbol sym) {
|
|
||||||
int numAttributes = nextChar();
|
|
||||||
if (numAttributes != 0) {
|
|
||||||
ListBuffer<TypeAnnotationProxy> proxies =
|
|
||||||
ListBuffer.lb();
|
|
||||||
for (int i = 0; i < numAttributes; i++)
|
|
||||||
proxies.append(readTypeAnnotation());
|
|
||||||
annotate.later(new TypeAnnotationCompleter(sym, proxies.toList()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Attach the default value for an annotation element.
|
/** Attach the default value for an annotation element.
|
||||||
*/
|
*/
|
||||||
void attachAnnotationDefault(final Symbol sym) {
|
void attachAnnotationDefault(final Symbol sym) {
|
||||||
|
@ -1398,121 +1368,6 @@ public class ClassReader implements Completer {
|
||||||
return new CompoundAnnotationProxy(t, pairs.toList());
|
return new CompoundAnnotationProxy(t, pairs.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
TypeAnnotationProxy readTypeAnnotation() {
|
|
||||||
CompoundAnnotationProxy proxy = readCompoundAnnotation();
|
|
||||||
TypeAnnotationPosition position = readPosition();
|
|
||||||
|
|
||||||
if (debugJSR308)
|
|
||||||
System.out.println("TA: reading: " + proxy + " @ " + position
|
|
||||||
+ " in " + log.currentSourceFile());
|
|
||||||
|
|
||||||
return new TypeAnnotationProxy(proxy, position);
|
|
||||||
}
|
|
||||||
|
|
||||||
TypeAnnotationPosition readPosition() {
|
|
||||||
byte tag = nextByte();
|
|
||||||
|
|
||||||
if (!TargetType.isValidTargetTypeValue(tag))
|
|
||||||
throw this.badClassFile("bad.type.annotation.value", tag);
|
|
||||||
|
|
||||||
TypeAnnotationPosition position = new TypeAnnotationPosition();
|
|
||||||
TargetType type = TargetType.fromTargetTypeValue(tag);
|
|
||||||
|
|
||||||
position.type = type;
|
|
||||||
|
|
||||||
switch (type) {
|
|
||||||
// type case
|
|
||||||
case TYPECAST:
|
|
||||||
case TYPECAST_GENERIC_OR_ARRAY:
|
|
||||||
// object creation
|
|
||||||
case INSTANCEOF:
|
|
||||||
case INSTANCEOF_GENERIC_OR_ARRAY:
|
|
||||||
// new expression
|
|
||||||
case NEW:
|
|
||||||
case NEW_GENERIC_OR_ARRAY:
|
|
||||||
position.offset = nextChar();
|
|
||||||
break;
|
|
||||||
// local variable
|
|
||||||
case LOCAL_VARIABLE:
|
|
||||||
case LOCAL_VARIABLE_GENERIC_OR_ARRAY:
|
|
||||||
int table_length = nextChar();
|
|
||||||
position.lvarOffset = new int[table_length];
|
|
||||||
position.lvarLength = new int[table_length];
|
|
||||||
position.lvarIndex = new int[table_length];
|
|
||||||
|
|
||||||
for (int i = 0; i < table_length; ++i) {
|
|
||||||
position.lvarOffset[i] = nextChar();
|
|
||||||
position.lvarLength[i] = nextChar();
|
|
||||||
position.lvarIndex[i] = nextChar();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
// method receiver
|
|
||||||
case METHOD_RECEIVER:
|
|
||||||
// Do nothing
|
|
||||||
break;
|
|
||||||
// type parameters
|
|
||||||
case CLASS_TYPE_PARAMETER:
|
|
||||||
case METHOD_TYPE_PARAMETER:
|
|
||||||
position.parameter_index = nextByte();
|
|
||||||
break;
|
|
||||||
// type parameter bounds
|
|
||||||
case CLASS_TYPE_PARAMETER_BOUND:
|
|
||||||
case CLASS_TYPE_PARAMETER_BOUND_GENERIC_OR_ARRAY:
|
|
||||||
case METHOD_TYPE_PARAMETER_BOUND:
|
|
||||||
case METHOD_TYPE_PARAMETER_BOUND_GENERIC_OR_ARRAY:
|
|
||||||
position.parameter_index = nextByte();
|
|
||||||
position.bound_index = nextByte();
|
|
||||||
break;
|
|
||||||
// wildcard
|
|
||||||
case WILDCARD_BOUND:
|
|
||||||
case WILDCARD_BOUND_GENERIC_OR_ARRAY:
|
|
||||||
position.wildcard_position = readPosition();
|
|
||||||
break;
|
|
||||||
// Class extends and implements clauses
|
|
||||||
case CLASS_EXTENDS:
|
|
||||||
case CLASS_EXTENDS_GENERIC_OR_ARRAY:
|
|
||||||
position.type_index = nextChar();
|
|
||||||
break;
|
|
||||||
// throws
|
|
||||||
case THROWS:
|
|
||||||
position.type_index = nextChar();
|
|
||||||
break;
|
|
||||||
case CLASS_LITERAL:
|
|
||||||
case CLASS_LITERAL_GENERIC_OR_ARRAY:
|
|
||||||
position.offset = nextChar();
|
|
||||||
break;
|
|
||||||
// method parameter: not specified
|
|
||||||
case METHOD_PARAMETER_GENERIC_OR_ARRAY:
|
|
||||||
position.parameter_index = nextByte();
|
|
||||||
break;
|
|
||||||
// method type argument: wasn't specified
|
|
||||||
case NEW_TYPE_ARGUMENT:
|
|
||||||
case NEW_TYPE_ARGUMENT_GENERIC_OR_ARRAY:
|
|
||||||
case METHOD_TYPE_ARGUMENT:
|
|
||||||
case METHOD_TYPE_ARGUMENT_GENERIC_OR_ARRAY:
|
|
||||||
position.offset = nextChar();
|
|
||||||
position.type_index = nextByte();
|
|
||||||
break;
|
|
||||||
// We don't need to worry abut these
|
|
||||||
case METHOD_RETURN_GENERIC_OR_ARRAY:
|
|
||||||
case FIELD_GENERIC_OR_ARRAY:
|
|
||||||
break;
|
|
||||||
case UNKNOWN:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new AssertionError("unknown type: " + position);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (type.hasLocation()) {
|
|
||||||
int len = nextChar();
|
|
||||||
ListBuffer<Integer> loc = ListBuffer.lb();
|
|
||||||
for (int i = 0; i < len; i++)
|
|
||||||
loc = loc.append((int)nextByte());
|
|
||||||
position.location = loc.toList();
|
|
||||||
}
|
|
||||||
|
|
||||||
return position;
|
|
||||||
}
|
|
||||||
Attribute readAttributeValue() {
|
Attribute readAttributeValue() {
|
||||||
char c = (char) buf[bp++];
|
char c = (char) buf[bp++];
|
||||||
switch (c) {
|
switch (c) {
|
||||||
|
@ -1825,45 +1680,6 @@ public class ClassReader implements Completer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class TypeAnnotationCompleter extends AnnotationCompleter {
|
|
||||||
|
|
||||||
List<TypeAnnotationProxy> proxies;
|
|
||||||
|
|
||||||
TypeAnnotationCompleter(Symbol sym,
|
|
||||||
List<TypeAnnotationProxy> proxies) {
|
|
||||||
super(sym, List.<CompoundAnnotationProxy>nil());
|
|
||||||
this.proxies = proxies;
|
|
||||||
}
|
|
||||||
|
|
||||||
List<Attribute.TypeCompound> deproxyTypeCompoundList(List<TypeAnnotationProxy> proxies) {
|
|
||||||
ListBuffer<Attribute.TypeCompound> buf = ListBuffer.lb();
|
|
||||||
for (TypeAnnotationProxy proxy: proxies) {
|
|
||||||
Attribute.Compound compound = deproxyCompound(proxy.compound);
|
|
||||||
Attribute.TypeCompound typeCompound = new Attribute.TypeCompound(compound, proxy.position);
|
|
||||||
buf.add(typeCompound);
|
|
||||||
}
|
|
||||||
return buf.toList();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void enterAnnotation() {
|
|
||||||
JavaFileObject previousClassFile = currentClassFile;
|
|
||||||
try {
|
|
||||||
currentClassFile = classFile;
|
|
||||||
List<Attribute.TypeCompound> newList = deproxyTypeCompoundList(proxies);
|
|
||||||
if (debugJSR308)
|
|
||||||
System.out.println("TA: reading: adding " + newList
|
|
||||||
+ " to symbol " + sym + " in " + log.currentSourceFile());
|
|
||||||
sym.typeAnnotations = ((sym.typeAnnotations == null)
|
|
||||||
? newList
|
|
||||||
: newList.prependList(sym.typeAnnotations));
|
|
||||||
|
|
||||||
} finally {
|
|
||||||
currentClassFile = previousClassFile;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Reading Symbols
|
* Reading Symbols
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -65,10 +65,6 @@ public class ClassWriter extends ClassFile {
|
||||||
|
|
||||||
private final Options options;
|
private final Options options;
|
||||||
|
|
||||||
/** Switch: debugging output for JSR 308-related operations.
|
|
||||||
*/
|
|
||||||
private boolean debugJSR308;
|
|
||||||
|
|
||||||
/** Switch: verbose output.
|
/** Switch: verbose output.
|
||||||
*/
|
*/
|
||||||
private boolean verbose;
|
private boolean verbose;
|
||||||
|
@ -180,7 +176,6 @@ public class ClassWriter extends ClassFile {
|
||||||
types = Types.instance(context);
|
types = Types.instance(context);
|
||||||
fileManager = context.get(JavaFileManager.class);
|
fileManager = context.get(JavaFileManager.class);
|
||||||
|
|
||||||
debugJSR308 = options.isSet("TA:writer");
|
|
||||||
verbose = options.isSet(VERBOSE);
|
verbose = options.isSet(VERBOSE);
|
||||||
scramble = options.isSet("-scramble");
|
scramble = options.isSet("-scramble");
|
||||||
scrambleAll = options.isSet("-scrambleAll");
|
scrambleAll = options.isSet("-scrambleAll");
|
||||||
|
@ -677,7 +672,6 @@ public class ClassWriter extends ClassFile {
|
||||||
acount++;
|
acount++;
|
||||||
}
|
}
|
||||||
acount += writeJavaAnnotations(sym.getAnnotationMirrors());
|
acount += writeJavaAnnotations(sym.getAnnotationMirrors());
|
||||||
acount += writeTypeAnnotations(sym.typeAnnotations);
|
|
||||||
return acount;
|
return acount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -772,46 +766,6 @@ public class ClassWriter extends ClassFile {
|
||||||
return attrCount;
|
return attrCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
int writeTypeAnnotations(List<Attribute.TypeCompound> typeAnnos) {
|
|
||||||
if (typeAnnos.isEmpty()) return 0;
|
|
||||||
|
|
||||||
ListBuffer<Attribute.TypeCompound> visibles = ListBuffer.lb();
|
|
||||||
ListBuffer<Attribute.TypeCompound> invisibles = ListBuffer.lb();
|
|
||||||
|
|
||||||
for (Attribute.TypeCompound tc : typeAnnos) {
|
|
||||||
if (tc.position.type == TargetType.UNKNOWN
|
|
||||||
|| !tc.position.emitToClassfile())
|
|
||||||
continue;
|
|
||||||
switch (types.getRetention(tc)) {
|
|
||||||
case SOURCE: break;
|
|
||||||
case CLASS: invisibles.append(tc); break;
|
|
||||||
case RUNTIME: visibles.append(tc); break;
|
|
||||||
default: ;// /* fail soft */ throw new AssertionError(vis);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int attrCount = 0;
|
|
||||||
if (visibles.length() != 0) {
|
|
||||||
int attrIndex = writeAttr(names.RuntimeVisibleTypeAnnotations);
|
|
||||||
databuf.appendChar(visibles.length());
|
|
||||||
for (Attribute.TypeCompound p : visibles)
|
|
||||||
writeTypeAnnotation(p);
|
|
||||||
endAttr(attrIndex);
|
|
||||||
attrCount++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (invisibles.length() != 0) {
|
|
||||||
int attrIndex = writeAttr(names.RuntimeInvisibleTypeAnnotations);
|
|
||||||
databuf.appendChar(invisibles.length());
|
|
||||||
for (Attribute.TypeCompound p : invisibles)
|
|
||||||
writeTypeAnnotation(p);
|
|
||||||
endAttr(attrIndex);
|
|
||||||
attrCount++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return attrCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** A visitor to write an attribute including its leading
|
/** A visitor to write an attribute including its leading
|
||||||
* single-character marker.
|
* single-character marker.
|
||||||
*/
|
*/
|
||||||
|
@ -888,104 +842,6 @@ public class ClassWriter extends ClassFile {
|
||||||
p.snd.accept(awriter);
|
p.snd.accept(awriter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void writeTypeAnnotation(Attribute.TypeCompound c) {
|
|
||||||
if (debugJSR308)
|
|
||||||
System.out.println("TA: writing " + c + " at " + c.position
|
|
||||||
+ " in " + log.currentSourceFile());
|
|
||||||
writeCompoundAttribute(c);
|
|
||||||
writePosition(c.position);
|
|
||||||
}
|
|
||||||
|
|
||||||
void writePosition(TypeAnnotationPosition p) {
|
|
||||||
databuf.appendByte(p.type.targetTypeValue());
|
|
||||||
switch (p.type) {
|
|
||||||
// type case
|
|
||||||
case TYPECAST:
|
|
||||||
case TYPECAST_GENERIC_OR_ARRAY:
|
|
||||||
// object creation
|
|
||||||
case INSTANCEOF:
|
|
||||||
case INSTANCEOF_GENERIC_OR_ARRAY:
|
|
||||||
// new expression
|
|
||||||
case NEW:
|
|
||||||
case NEW_GENERIC_OR_ARRAY:
|
|
||||||
databuf.appendChar(p.offset);
|
|
||||||
break;
|
|
||||||
// local variable
|
|
||||||
case LOCAL_VARIABLE:
|
|
||||||
case LOCAL_VARIABLE_GENERIC_OR_ARRAY:
|
|
||||||
databuf.appendChar(p.lvarOffset.length); // for table length
|
|
||||||
for (int i = 0; i < p.lvarOffset.length; ++i) {
|
|
||||||
databuf.appendChar(p.lvarOffset[i]);
|
|
||||||
databuf.appendChar(p.lvarLength[i]);
|
|
||||||
databuf.appendChar(p.lvarIndex[i]);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
// method receiver
|
|
||||||
case METHOD_RECEIVER:
|
|
||||||
// Do nothing
|
|
||||||
break;
|
|
||||||
// type parameters
|
|
||||||
case CLASS_TYPE_PARAMETER:
|
|
||||||
case METHOD_TYPE_PARAMETER:
|
|
||||||
databuf.appendByte(p.parameter_index);
|
|
||||||
break;
|
|
||||||
// type parameters bounds
|
|
||||||
case CLASS_TYPE_PARAMETER_BOUND:
|
|
||||||
case CLASS_TYPE_PARAMETER_BOUND_GENERIC_OR_ARRAY:
|
|
||||||
case METHOD_TYPE_PARAMETER_BOUND:
|
|
||||||
case METHOD_TYPE_PARAMETER_BOUND_GENERIC_OR_ARRAY:
|
|
||||||
databuf.appendByte(p.parameter_index);
|
|
||||||
databuf.appendByte(p.bound_index);
|
|
||||||
break;
|
|
||||||
// wildcards
|
|
||||||
case WILDCARD_BOUND:
|
|
||||||
case WILDCARD_BOUND_GENERIC_OR_ARRAY:
|
|
||||||
writePosition(p.wildcard_position);
|
|
||||||
break;
|
|
||||||
// Class extends and implements clauses
|
|
||||||
case CLASS_EXTENDS:
|
|
||||||
case CLASS_EXTENDS_GENERIC_OR_ARRAY:
|
|
||||||
databuf.appendChar(p.type_index);
|
|
||||||
break;
|
|
||||||
// throws
|
|
||||||
case THROWS:
|
|
||||||
databuf.appendChar(p.type_index);
|
|
||||||
break;
|
|
||||||
case CLASS_LITERAL:
|
|
||||||
case CLASS_LITERAL_GENERIC_OR_ARRAY:
|
|
||||||
databuf.appendChar(p.offset);
|
|
||||||
break;
|
|
||||||
// method parameter: not specified
|
|
||||||
case METHOD_PARAMETER_GENERIC_OR_ARRAY:
|
|
||||||
databuf.appendByte(p.parameter_index);
|
|
||||||
break;
|
|
||||||
// method type argument: wasn't specified
|
|
||||||
case NEW_TYPE_ARGUMENT:
|
|
||||||
case NEW_TYPE_ARGUMENT_GENERIC_OR_ARRAY:
|
|
||||||
case METHOD_TYPE_ARGUMENT:
|
|
||||||
case METHOD_TYPE_ARGUMENT_GENERIC_OR_ARRAY:
|
|
||||||
databuf.appendChar(p.offset);
|
|
||||||
databuf.appendByte(p.type_index);
|
|
||||||
break;
|
|
||||||
// We don't need to worry abut these
|
|
||||||
case METHOD_RETURN_GENERIC_OR_ARRAY:
|
|
||||||
case FIELD_GENERIC_OR_ARRAY:
|
|
||||||
break;
|
|
||||||
case UNKNOWN:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new AssertionError("unknown position: " + p);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Append location data for generics/arrays.
|
|
||||||
if (p.type.hasLocation()) {
|
|
||||||
databuf.appendChar(p.location.size());
|
|
||||||
for (int i : p.location)
|
|
||||||
databuf.appendByte((byte)i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* Writing Objects
|
* Writing Objects
|
||||||
**********************************************************************/
|
**********************************************************************/
|
||||||
|
@ -1698,7 +1554,6 @@ public class ClassWriter extends ClassFile {
|
||||||
|
|
||||||
acount += writeFlagAttrs(c.flags());
|
acount += writeFlagAttrs(c.flags());
|
||||||
acount += writeJavaAnnotations(c.getAnnotationMirrors());
|
acount += writeJavaAnnotations(c.getAnnotationMirrors());
|
||||||
acount += writeTypeAnnotations(c.typeAnnotations);
|
|
||||||
acount += writeEnclosingMethodAttribute(c);
|
acount += writeEnclosingMethodAttribute(c);
|
||||||
|
|
||||||
poolbuf.appendInt(JAVA_MAGIC);
|
poolbuf.appendInt(JAVA_MAGIC);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -1912,29 +1912,12 @@ public class Code {
|
||||||
if (length < Character.MAX_VALUE) {
|
if (length < Character.MAX_VALUE) {
|
||||||
v.length = length;
|
v.length = length;
|
||||||
putVar(v);
|
putVar(v);
|
||||||
fillLocalVarPosition(v);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
state.defined.excl(adr);
|
state.defined.excl(adr);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void fillLocalVarPosition(LocalVar lv) {
|
|
||||||
if (lv == null || lv.sym == null
|
|
||||||
|| lv.sym.typeAnnotations == null)
|
|
||||||
return;
|
|
||||||
for (Attribute.TypeCompound ta : lv.sym.typeAnnotations) {
|
|
||||||
TypeAnnotationPosition p = ta.position;
|
|
||||||
while (p != null) {
|
|
||||||
p.lvarOffset = new int[] { (int)lv.start_pc };
|
|
||||||
p.lvarLength = new int[] { (int)lv.length };
|
|
||||||
p.lvarIndex = new int[] { (int)lv.reg };
|
|
||||||
p.isValidOffset = true;
|
|
||||||
p = p.wildcard_position;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Put a live variable range into the buffer to be output to the
|
/** Put a live variable range into the buffer to be output to the
|
||||||
* class file.
|
* class file.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -1682,7 +1682,6 @@ public class Gen extends JCTree.Visitor {
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
|
|
||||||
public void visitApply(JCMethodInvocation tree) {
|
public void visitApply(JCMethodInvocation tree) {
|
||||||
setTypeAnnotationPositions(tree.pos);
|
|
||||||
// Generate code for method.
|
// Generate code for method.
|
||||||
Item m = genExpr(tree.meth, methodType);
|
Item m = genExpr(tree.meth, methodType);
|
||||||
// Generate code for all arguments, where the expected types are
|
// Generate code for all arguments, where the expected types are
|
||||||
|
@ -1718,48 +1717,10 @@ public class Gen extends JCTree.Visitor {
|
||||||
result = items.makeStackItem(pt);
|
result = items.makeStackItem(pt);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setTypeAnnotationPositions(int treePos) {
|
|
||||||
MethodSymbol meth = code.meth;
|
|
||||||
|
|
||||||
for (Attribute.TypeCompound ta : meth.typeAnnotations) {
|
|
||||||
if (ta.position.pos == treePos) {
|
|
||||||
ta.position.offset = code.cp;
|
|
||||||
ta.position.lvarOffset = new int[] { code.cp };
|
|
||||||
ta.position.isValidOffset = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (code.meth.getKind() != ElementKind.CONSTRUCTOR
|
|
||||||
&& code.meth.getKind() != ElementKind.STATIC_INIT)
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (Attribute.TypeCompound ta : meth.owner.typeAnnotations) {
|
|
||||||
if (ta.position.pos == treePos) {
|
|
||||||
ta.position.offset = code.cp;
|
|
||||||
ta.position.lvarOffset = new int[] { code.cp };
|
|
||||||
ta.position.isValidOffset = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ClassSymbol clazz = meth.enclClass();
|
|
||||||
for (Symbol s : new com.sun.tools.javac.model.FilteredMemberList(clazz.members())) {
|
|
||||||
if (!s.getKind().isField())
|
|
||||||
continue;
|
|
||||||
for (Attribute.TypeCompound ta : s.typeAnnotations) {
|
|
||||||
if (ta.position.pos == treePos) {
|
|
||||||
ta.position.offset = code.cp;
|
|
||||||
ta.position.lvarOffset = new int[] { code.cp };
|
|
||||||
ta.position.isValidOffset = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void visitNewClass(JCNewClass tree) {
|
public void visitNewClass(JCNewClass tree) {
|
||||||
// Enclosing instances or anonymous classes should have been eliminated
|
// Enclosing instances or anonymous classes should have been eliminated
|
||||||
// by now.
|
// by now.
|
||||||
assert tree.encl == null && tree.def == null;
|
assert tree.encl == null && tree.def == null;
|
||||||
setTypeAnnotationPositions(tree.pos);
|
|
||||||
|
|
||||||
code.emitop2(new_, makeRef(tree.pos(), tree.type));
|
code.emitop2(new_, makeRef(tree.pos(), tree.type));
|
||||||
code.emitop0(dup);
|
code.emitop0(dup);
|
||||||
|
@ -1774,7 +1735,6 @@ public class Gen extends JCTree.Visitor {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void visitNewArray(JCNewArray tree) {
|
public void visitNewArray(JCNewArray tree) {
|
||||||
setTypeAnnotationPositions(tree.pos);
|
|
||||||
|
|
||||||
if (tree.elems != null) {
|
if (tree.elems != null) {
|
||||||
Type elemtype = types.elemtype(tree.type);
|
Type elemtype = types.elemtype(tree.type);
|
||||||
|
@ -2104,7 +2064,6 @@ public class Gen extends JCTree.Visitor {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void visitTypeCast(JCTypeCast tree) {
|
public void visitTypeCast(JCTypeCast tree) {
|
||||||
setTypeAnnotationPositions(tree.pos);
|
|
||||||
result = genExpr(tree.expr, tree.clazz.type).load();
|
result = genExpr(tree.expr, tree.clazz.type).load();
|
||||||
// Additional code is only needed if we cast to a reference type
|
// Additional code is only needed if we cast to a reference type
|
||||||
// which is not statically a supertype of the expression's type.
|
// which is not statically a supertype of the expression's type.
|
||||||
|
@ -2121,8 +2080,6 @@ public class Gen extends JCTree.Visitor {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void visitTypeTest(JCInstanceOf tree) {
|
public void visitTypeTest(JCInstanceOf tree) {
|
||||||
setTypeAnnotationPositions(tree.pos);
|
|
||||||
|
|
||||||
genExpr(tree.expr, tree.expr.type).load();
|
genExpr(tree.expr, tree.expr.type).load();
|
||||||
code.emitop2(instanceof_, makeRef(tree.pos(), tree.clazz.type));
|
code.emitop2(instanceof_, makeRef(tree.pos(), tree.clazz.type));
|
||||||
result = items.makeStackItem(syms.booleanType);
|
result = items.makeStackItem(syms.booleanType);
|
||||||
|
@ -2164,15 +2121,9 @@ public class Gen extends JCTree.Visitor {
|
||||||
|
|
||||||
if (tree.name == names._class) {
|
if (tree.name == names._class) {
|
||||||
assert target.hasClassLiterals();
|
assert target.hasClassLiterals();
|
||||||
setTypeAnnotationPositions(tree.pos);
|
|
||||||
code.emitop2(ldc2, makeRef(tree.pos(), tree.selected.type));
|
code.emitop2(ldc2, makeRef(tree.pos(), tree.selected.type));
|
||||||
result = items.makeStackItem(pt);
|
result = items.makeStackItem(pt);
|
||||||
return;
|
return;
|
||||||
} else if (tree.name == names.TYPE) {
|
|
||||||
// Set the annotation positions for primitive class literals
|
|
||||||
// (e.g. int.class) which have been converted to TYPE field
|
|
||||||
// access on the corresponding boxed type (e.g. Integer.TYPE).
|
|
||||||
setTypeAnnotationPositions(tree.pos);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Symbol ssym = TreeInfo.symbol(tree.selected);
|
Symbol ssym = TreeInfo.symbol(tree.selected);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -49,7 +49,6 @@ import javax.tools.StandardJavaFileManager;
|
||||||
import javax.tools.JavaFileObject;
|
import javax.tools.JavaFileObject;
|
||||||
import javax.tools.DiagnosticListener;
|
import javax.tools.DiagnosticListener;
|
||||||
|
|
||||||
//308 import com.sun.source.util.AbstractTypeProcessor;
|
|
||||||
import com.sun.source.util.TaskEvent;
|
import com.sun.source.util.TaskEvent;
|
||||||
import com.sun.source.util.TaskListener;
|
import com.sun.source.util.TaskListener;
|
||||||
import com.sun.tools.javac.api.JavacTaskImpl;
|
import com.sun.tools.javac.api.JavacTaskImpl;
|
||||||
|
@ -712,7 +711,6 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea
|
||||||
}
|
}
|
||||||
|
|
||||||
if (matchedNames.size() > 0 || ps.contributed) {
|
if (matchedNames.size() > 0 || ps.contributed) {
|
||||||
//308 foundTypeProcessors = foundTypeProcessors || (ps.processor instanceof AbstractTypeProcessor);
|
|
||||||
boolean processingResult = callProcessor(ps.processor, typeElements, renv);
|
boolean processingResult = callProcessor(ps.processor, typeElements, renv);
|
||||||
ps.contributed = true;
|
ps.contributed = true;
|
||||||
ps.removeSupportedOptions(unmatchedProcessorOptions);
|
ps.removeSupportedOptions(unmatchedProcessorOptions);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#
|
#
|
||||||
# Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -971,8 +971,6 @@ compiler.misc.bad.const.pool.tag.at=\
|
||||||
bad constant pool tag: {0} at {1}
|
bad constant pool tag: {0} at {1}
|
||||||
compiler.misc.bad.signature=\
|
compiler.misc.bad.signature=\
|
||||||
bad signature: {0}
|
bad signature: {0}
|
||||||
compiler.misc.bad.type.annotation.value=\
|
|
||||||
bad type annotation target type value: {0}
|
|
||||||
compiler.misc.class.file.wrong.class=\
|
compiler.misc.class.file.wrong.class=\
|
||||||
class file contains wrong class: {0}
|
class file contains wrong class: {0}
|
||||||
compiler.misc.class.file.not.found=\
|
compiler.misc.class.file.not.found=\
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -640,7 +640,6 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition {
|
||||||
public JCExpression restype;
|
public JCExpression restype;
|
||||||
public List<JCTypeParameter> typarams;
|
public List<JCTypeParameter> typarams;
|
||||||
public List<JCVariableDecl> params;
|
public List<JCVariableDecl> params;
|
||||||
public List<JCTypeAnnotation> receiverAnnotations;
|
|
||||||
public List<JCExpression> thrown;
|
public List<JCExpression> thrown;
|
||||||
public JCBlock body;
|
public JCBlock body;
|
||||||
public JCExpression defaultValue; // for annotation types
|
public JCExpression defaultValue; // for annotation types
|
||||||
|
@ -650,7 +649,6 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition {
|
||||||
JCExpression restype,
|
JCExpression restype,
|
||||||
List<JCTypeParameter> typarams,
|
List<JCTypeParameter> typarams,
|
||||||
List<JCVariableDecl> params,
|
List<JCVariableDecl> params,
|
||||||
List<JCTypeAnnotation> receiver,
|
|
||||||
List<JCExpression> thrown,
|
List<JCExpression> thrown,
|
||||||
JCBlock body,
|
JCBlock body,
|
||||||
JCExpression defaultValue,
|
JCExpression defaultValue,
|
||||||
|
@ -661,7 +659,6 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition {
|
||||||
this.restype = restype;
|
this.restype = restype;
|
||||||
this.typarams = typarams;
|
this.typarams = typarams;
|
||||||
this.params = params;
|
this.params = params;
|
||||||
this.receiverAnnotations = (receiver != null ? receiver : List.<JCTypeAnnotation>nil());
|
|
||||||
this.thrown = thrown;
|
this.thrown = thrown;
|
||||||
this.body = body;
|
this.body = body;
|
||||||
this.defaultValue = defaultValue;
|
this.defaultValue = defaultValue;
|
||||||
|
@ -680,7 +677,6 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition {
|
||||||
public List<JCVariableDecl> getParameters() {
|
public List<JCVariableDecl> getParameters() {
|
||||||
return params;
|
return params;
|
||||||
}
|
}
|
||||||
public List<JCTypeAnnotation> getReceiverAnnotations() { return receiverAnnotations; }
|
|
||||||
public List<JCExpression> getThrows() {
|
public List<JCExpression> getThrows() {
|
||||||
return thrown;
|
return thrown;
|
||||||
}
|
}
|
||||||
|
@ -1402,8 +1398,6 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition {
|
||||||
public static class JCNewArray extends JCExpression implements NewArrayTree {
|
public static class JCNewArray extends JCExpression implements NewArrayTree {
|
||||||
public JCExpression elemtype;
|
public JCExpression elemtype;
|
||||||
public List<JCExpression> dims;
|
public List<JCExpression> dims;
|
||||||
public List<JCTypeAnnotation> annotations;
|
|
||||||
public List<List<JCTypeAnnotation>> dimAnnotations;
|
|
||||||
public List<JCExpression> elems;
|
public List<JCExpression> elems;
|
||||||
protected JCNewArray(JCExpression elemtype,
|
protected JCNewArray(JCExpression elemtype,
|
||||||
List<JCExpression> dims,
|
List<JCExpression> dims,
|
||||||
|
@ -1411,8 +1405,6 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition {
|
||||||
{
|
{
|
||||||
this.elemtype = elemtype;
|
this.elemtype = elemtype;
|
||||||
this.dims = dims;
|
this.dims = dims;
|
||||||
this.annotations = List.nil();
|
|
||||||
this.dimAnnotations = List.nil();
|
|
||||||
this.elems = elems;
|
this.elems = elems;
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
|
@ -1923,11 +1915,9 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition {
|
||||||
public static class JCTypeParameter extends JCTree implements TypeParameterTree {
|
public static class JCTypeParameter extends JCTree implements TypeParameterTree {
|
||||||
public Name name;
|
public Name name;
|
||||||
public List<JCExpression> bounds;
|
public List<JCExpression> bounds;
|
||||||
public List<JCTypeAnnotation> annotations;
|
protected JCTypeParameter(Name name, List<JCExpression> bounds) {
|
||||||
protected JCTypeParameter(Name name, List<JCExpression> bounds, List<JCTypeAnnotation> annotations) {
|
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.bounds = bounds;
|
this.bounds = bounds;
|
||||||
this.annotations = annotations;
|
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
public void accept(Visitor v) { v.visitTypeParameter(this); }
|
public void accept(Visitor v) { v.visitTypeParameter(this); }
|
||||||
|
@ -1937,9 +1927,6 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition {
|
||||||
public List<JCExpression> getBounds() {
|
public List<JCExpression> getBounds() {
|
||||||
return bounds;
|
return bounds;
|
||||||
}
|
}
|
||||||
public List<JCTypeAnnotation> getAnnotations() {
|
|
||||||
return annotations;
|
|
||||||
}
|
|
||||||
@Override
|
@Override
|
||||||
public <R,D> R accept(TreeVisitor<R,D> v, D d) {
|
public <R,D> R accept(TreeVisitor<R,D> v, D d) {
|
||||||
return v.visitTypeParameter(this, d);
|
return v.visitTypeParameter(this, d);
|
||||||
|
@ -2030,16 +2017,6 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class JCTypeAnnotation extends JCAnnotation {
|
|
||||||
public TypeAnnotationPosition annotation_position;
|
|
||||||
public Attribute.TypeCompound attribute_field;
|
|
||||||
|
|
||||||
protected JCTypeAnnotation(JCTree annotationType, List<JCExpression> args) {
|
|
||||||
super(annotationType, args);
|
|
||||||
this.annotation_position = new TypeAnnotationPosition();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class JCModifiers extends JCTree implements com.sun.source.tree.ModifiersTree {
|
public static class JCModifiers extends JCTree implements com.sun.source.tree.ModifiersTree {
|
||||||
public long flags;
|
public long flags;
|
||||||
public List<JCAnnotation> annotations;
|
public List<JCAnnotation> annotations;
|
||||||
|
@ -2067,40 +2044,6 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class JCAnnotatedType extends JCExpression
|
|
||||||
//308 implements com.sun.source.tree.AnnotatedTypeTree
|
|
||||||
{
|
|
||||||
public List<JCTypeAnnotation> annotations;
|
|
||||||
public JCExpression underlyingType;
|
|
||||||
protected JCAnnotatedType(List<JCTypeAnnotation> annotations, JCExpression underlyingType) {
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
//308 this.annotations = annotations;
|
|
||||||
//308 this.underlyingType = underlyingType;
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public void accept(Visitor v) { v.visitAnnotatedType(this); }
|
|
||||||
|
|
||||||
public Kind getKind() {
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
//308 return Kind.ANNOTATED_TYPE;
|
|
||||||
}
|
|
||||||
public List<JCTypeAnnotation> getAnnotations() {
|
|
||||||
return annotations;
|
|
||||||
}
|
|
||||||
public JCExpression getUnderlyingType() {
|
|
||||||
return underlyingType;
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public <R,D> R accept(TreeVisitor<R,D> v, D d) {
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
//308 return v.visitAnnotatedType(this, d);
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public int getTag() {
|
|
||||||
return ANNOTATED_TYPE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class JCErroneous extends JCExpression
|
public static class JCErroneous extends JCExpression
|
||||||
implements com.sun.source.tree.ErroneousTree {
|
implements com.sun.source.tree.ErroneousTree {
|
||||||
public List<? extends JCTree> errs;
|
public List<? extends JCTree> errs;
|
||||||
|
@ -2168,7 +2111,6 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition {
|
||||||
JCExpression restype,
|
JCExpression restype,
|
||||||
List<JCTypeParameter> typarams,
|
List<JCTypeParameter> typarams,
|
||||||
List<JCVariableDecl> params,
|
List<JCVariableDecl> params,
|
||||||
List<JCTypeAnnotation> receiver,
|
|
||||||
List<JCExpression> thrown,
|
List<JCExpression> thrown,
|
||||||
JCBlock body,
|
JCBlock body,
|
||||||
JCExpression defaultValue);
|
JCExpression defaultValue);
|
||||||
|
@ -2290,7 +2232,6 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition {
|
||||||
public void visitTypeBoundKind(TypeBoundKind that) { visitTree(that); }
|
public void visitTypeBoundKind(TypeBoundKind that) { visitTree(that); }
|
||||||
public void visitAnnotation(JCAnnotation that) { visitTree(that); }
|
public void visitAnnotation(JCAnnotation that) { visitTree(that); }
|
||||||
public void visitModifiers(JCModifiers that) { visitTree(that); }
|
public void visitModifiers(JCModifiers that) { visitTree(that); }
|
||||||
public void visitAnnotatedType(JCAnnotatedType that) { visitTree(that); }
|
|
||||||
public void visitErroneous(JCErroneous that) { visitTree(that); }
|
public void visitErroneous(JCErroneous that) { visitTree(that); }
|
||||||
public void visitLetExpr(LetExpr that) { visitTree(that); }
|
public void visitLetExpr(LetExpr that) { visitTree(that); }
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -224,15 +224,6 @@ public class Pretty extends JCTree.Visitor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void printTypeAnnotations(List<JCTypeAnnotation> trees) throws IOException {
|
|
||||||
if (trees.nonEmpty())
|
|
||||||
print(" ");
|
|
||||||
for (List<JCTypeAnnotation> l = trees; l.nonEmpty(); l = l.tail) {
|
|
||||||
printExpr(l.head);
|
|
||||||
print(" ");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Print documentation comment, if it exists
|
/** Print documentation comment, if it exists
|
||||||
* @param tree The tree for which a documentation comment should be printed.
|
* @param tree The tree for which a documentation comment should be printed.
|
||||||
*/
|
*/
|
||||||
|
@ -890,33 +881,21 @@ public class Pretty extends JCTree.Visitor {
|
||||||
try {
|
try {
|
||||||
if (tree.elemtype != null) {
|
if (tree.elemtype != null) {
|
||||||
print("new ");
|
print("new ");
|
||||||
printTypeAnnotations(tree.annotations);
|
|
||||||
JCTree elem = tree.elemtype;
|
JCTree elem = tree.elemtype;
|
||||||
printBaseElementType(elem);
|
if (elem.getTag() == JCTree.TYPEARRAY)
|
||||||
boolean isElemAnnoType = elem instanceof JCAnnotatedType;
|
printBaseElementType((JCArrayTypeTree) elem);
|
||||||
int i = 0;
|
else
|
||||||
List<List<JCTypeAnnotation>> da = tree.dimAnnotations;
|
printExpr(elem);
|
||||||
for (List<JCExpression> l = tree.dims; l.nonEmpty(); l = l.tail) {
|
for (List<JCExpression> l = tree.dims; l.nonEmpty(); l = l.tail) {
|
||||||
if (da.size() > i) {
|
|
||||||
printTypeAnnotations(da.get(i));
|
|
||||||
}
|
|
||||||
print("[");
|
print("[");
|
||||||
i++;
|
|
||||||
printExpr(l.head);
|
printExpr(l.head);
|
||||||
print("]");
|
print("]");
|
||||||
}
|
}
|
||||||
if (tree.elems != null) {
|
|
||||||
if (isElemAnnoType) {
|
|
||||||
printTypeAnnotations(((JCAnnotatedType)tree.elemtype).annotations);
|
|
||||||
}
|
|
||||||
print("[]");
|
|
||||||
}
|
|
||||||
if (isElemAnnoType)
|
|
||||||
elem = ((JCAnnotatedType)elem).underlyingType;
|
|
||||||
if (elem instanceof JCArrayTypeTree)
|
if (elem instanceof JCArrayTypeTree)
|
||||||
printBrackets((JCArrayTypeTree) elem);
|
printBrackets((JCArrayTypeTree) elem);
|
||||||
}
|
}
|
||||||
if (tree.elems != null) {
|
if (tree.elems != null) {
|
||||||
|
if (tree.elemtype != null) print("[]");
|
||||||
print("{");
|
print("{");
|
||||||
printExprs(tree.elems);
|
printExprs(tree.elems);
|
||||||
print("}");
|
print("}");
|
||||||
|
@ -1173,11 +1152,6 @@ public class Pretty extends JCTree.Visitor {
|
||||||
JCTree elem;
|
JCTree elem;
|
||||||
while (true) {
|
while (true) {
|
||||||
elem = tree.elemtype;
|
elem = tree.elemtype;
|
||||||
if (elem.getTag() == JCTree.ANNOTATED_TYPE) {
|
|
||||||
JCAnnotatedType atype = (JCAnnotatedType) elem;
|
|
||||||
printTypeAnnotations(atype.annotations);
|
|
||||||
elem = atype.underlyingType;
|
|
||||||
}
|
|
||||||
print("[]");
|
print("[]");
|
||||||
if (elem.getTag() != JCTree.TYPEARRAY) break;
|
if (elem.getTag() != JCTree.TYPEARRAY) break;
|
||||||
tree = (JCArrayTypeTree) elem;
|
tree = (JCArrayTypeTree) elem;
|
||||||
|
@ -1272,15 +1246,6 @@ public class Pretty extends JCTree.Visitor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void visitAnnotatedType(JCAnnotatedType tree) {
|
|
||||||
try {
|
|
||||||
printTypeAnnotations(tree.annotations);
|
|
||||||
printExpr(tree.underlyingType);
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new UncheckedIOException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void visitTree(JCTree tree) {
|
public void visitTree(JCTree tree) {
|
||||||
try {
|
try {
|
||||||
print("(UNKNOWN: " + tree + ")");
|
print("(UNKNOWN: " + tree + ")");
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -71,13 +71,6 @@ public class TreeCopier<P> implements TreeVisitor<JCTree,P> {
|
||||||
return lb.toList();
|
return lb.toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
//308 public JCTree visitAnnotatedType(AnnotatedTypeTree node, P p) {
|
|
||||||
//308 JCAnnotatedType t = (JCAnnotatedType) node;
|
|
||||||
//308 List<JCTypeAnnotation> annotations = copy(t.annotations, p);
|
|
||||||
//308 JCExpression underlyingType = copy(t.underlyingType, p);
|
|
||||||
//308 return M.at(t.pos).AnnotatedType(annotations, underlyingType);
|
|
||||||
//308 }
|
|
||||||
|
|
||||||
public JCTree visitAnnotation(AnnotationTree node, P p) {
|
public JCTree visitAnnotation(AnnotationTree node, P p) {
|
||||||
JCAnnotation t = (JCAnnotation) node;
|
JCAnnotation t = (JCAnnotation) node;
|
||||||
JCTree annotationType = copy(t.annotationType, p);
|
JCTree annotationType = copy(t.annotationType, p);
|
||||||
|
@ -240,11 +233,10 @@ public class TreeCopier<P> implements TreeVisitor<JCTree,P> {
|
||||||
JCExpression restype = copy(t.restype, p);
|
JCExpression restype = copy(t.restype, p);
|
||||||
List<JCTypeParameter> typarams = copy(t.typarams, p);
|
List<JCTypeParameter> typarams = copy(t.typarams, p);
|
||||||
List<JCVariableDecl> params = copy(t.params, p);
|
List<JCVariableDecl> params = copy(t.params, p);
|
||||||
List<JCTypeAnnotation> receiver = copy(t.receiverAnnotations, p);
|
|
||||||
List<JCExpression> thrown = copy(t.thrown, p);
|
List<JCExpression> thrown = copy(t.thrown, p);
|
||||||
JCBlock body = copy(t.body, p);
|
JCBlock body = copy(t.body, p);
|
||||||
JCExpression defaultValue = copy(t.defaultValue, p);
|
JCExpression defaultValue = copy(t.defaultValue, p);
|
||||||
return M.at(t.pos).MethodDef(mods, t.name, restype, typarams, params, receiver, thrown, body, defaultValue);
|
return M.at(t.pos).MethodDef(mods, t.name, restype, typarams, params, thrown, body, defaultValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
public JCTree visitMethodInvocation(MethodInvocationTree node, P p) {
|
public JCTree visitMethodInvocation(MethodInvocationTree node, P p) {
|
||||||
|
@ -372,9 +364,8 @@ public class TreeCopier<P> implements TreeVisitor<JCTree,P> {
|
||||||
|
|
||||||
public JCTree visitTypeParameter(TypeParameterTree node, P p) {
|
public JCTree visitTypeParameter(TypeParameterTree node, P p) {
|
||||||
JCTypeParameter t = (JCTypeParameter) node;
|
JCTypeParameter t = (JCTypeParameter) node;
|
||||||
List<JCTypeAnnotation> annos = copy(t.annotations, p);
|
|
||||||
List<JCExpression> bounds = copy(t.bounds, p);
|
List<JCExpression> bounds = copy(t.bounds, p);
|
||||||
return M.at(t.pos).TypeParameter(t.name, bounds, annos);
|
return M.at(t.pos).TypeParameter(t.name, bounds);
|
||||||
}
|
}
|
||||||
|
|
||||||
public JCTree visitInstanceOf(InstanceOfTree node, P p) {
|
public JCTree visitInstanceOf(InstanceOfTree node, P p) {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -311,12 +311,6 @@ public class TreeInfo {
|
||||||
case(JCTree.POSTINC):
|
case(JCTree.POSTINC):
|
||||||
case(JCTree.POSTDEC):
|
case(JCTree.POSTDEC):
|
||||||
return getStartPos(((JCUnary) tree).arg);
|
return getStartPos(((JCUnary) tree).arg);
|
||||||
case(JCTree.ANNOTATED_TYPE): {
|
|
||||||
JCAnnotatedType node = (JCAnnotatedType) tree;
|
|
||||||
if (node.annotations.nonEmpty())
|
|
||||||
return getStartPos(node.annotations.head);
|
|
||||||
return getStartPos(node.underlyingType);
|
|
||||||
}
|
|
||||||
case(JCTree.NEWCLASS): {
|
case(JCTree.NEWCLASS): {
|
||||||
JCNewClass node = (JCNewClass)tree;
|
JCNewClass node = (JCNewClass)tree;
|
||||||
if (node.encl != null)
|
if (node.encl != null)
|
||||||
|
@ -420,8 +414,6 @@ public class TreeInfo {
|
||||||
return getEndPos(((JCUnary) tree).arg, endPositions);
|
return getEndPos(((JCUnary) tree).arg, endPositions);
|
||||||
case(JCTree.WHILELOOP):
|
case(JCTree.WHILELOOP):
|
||||||
return getEndPos(((JCWhileLoop) tree).body, endPositions);
|
return getEndPos(((JCWhileLoop) tree).body, endPositions);
|
||||||
case(JCTree.ANNOTATED_TYPE):
|
|
||||||
return getEndPos(((JCAnnotatedType) tree).underlyingType, endPositions);
|
|
||||||
case(JCTree.ERRONEOUS): {
|
case(JCTree.ERRONEOUS): {
|
||||||
JCErroneous node = (JCErroneous)tree;
|
JCErroneous node = (JCErroneous)tree;
|
||||||
if (node.errs != null && node.errs.nonEmpty())
|
if (node.errs != null && node.errs.nonEmpty())
|
||||||
|
@ -909,8 +901,6 @@ public class TreeInfo {
|
||||||
*/
|
*/
|
||||||
public static JCExpression typeIn(JCExpression tree) {
|
public static JCExpression typeIn(JCExpression tree) {
|
||||||
switch (tree.getTag()) {
|
switch (tree.getTag()) {
|
||||||
case JCTree.ANNOTATED_TYPE:
|
|
||||||
return ((JCAnnotatedType)tree).underlyingType;
|
|
||||||
case JCTree.IDENT: /* simple names */
|
case JCTree.IDENT: /* simple names */
|
||||||
case JCTree.TYPEIDENT: /* primitive name */
|
case JCTree.TYPEIDENT: /* primitive name */
|
||||||
case JCTree.SELECT: /* qualified name */
|
case JCTree.SELECT: /* qualified name */
|
||||||
|
@ -930,8 +920,6 @@ public class TreeInfo {
|
||||||
return innermostType(((JCArrayTypeTree)type).elemtype);
|
return innermostType(((JCArrayTypeTree)type).elemtype);
|
||||||
case JCTree.WILDCARD:
|
case JCTree.WILDCARD:
|
||||||
return innermostType(((JCWildcard)type).inner);
|
return innermostType(((JCWildcard)type).inner);
|
||||||
case JCTree.ANNOTATED_TYPE:
|
|
||||||
return innermostType(((JCAnnotatedType)type).underlyingType);
|
|
||||||
default:
|
default:
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -169,27 +169,11 @@ public class TreeMaker implements JCTree.Factory {
|
||||||
List<JCExpression> thrown,
|
List<JCExpression> thrown,
|
||||||
JCBlock body,
|
JCBlock body,
|
||||||
JCExpression defaultValue) {
|
JCExpression defaultValue) {
|
||||||
return MethodDef(
|
|
||||||
mods, name, restype, typarams, params,
|
|
||||||
null, thrown, body, defaultValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
public JCMethodDecl MethodDef(JCModifiers mods,
|
|
||||||
Name name,
|
|
||||||
JCExpression restype,
|
|
||||||
List<JCTypeParameter> typarams,
|
|
||||||
List<JCVariableDecl> params,
|
|
||||||
List<JCTypeAnnotation> receiver,
|
|
||||||
List<JCExpression> thrown,
|
|
||||||
JCBlock body,
|
|
||||||
JCExpression defaultValue)
|
|
||||||
{
|
|
||||||
JCMethodDecl tree = new JCMethodDecl(mods,
|
JCMethodDecl tree = new JCMethodDecl(mods,
|
||||||
name,
|
name,
|
||||||
restype,
|
restype,
|
||||||
typarams,
|
typarams,
|
||||||
params,
|
params,
|
||||||
receiver,
|
|
||||||
thrown,
|
thrown,
|
||||||
body,
|
body,
|
||||||
defaultValue,
|
defaultValue,
|
||||||
|
@ -458,11 +442,7 @@ public class TreeMaker implements JCTree.Factory {
|
||||||
}
|
}
|
||||||
|
|
||||||
public JCTypeParameter TypeParameter(Name name, List<JCExpression> bounds) {
|
public JCTypeParameter TypeParameter(Name name, List<JCExpression> bounds) {
|
||||||
return TypeParameter(name, bounds, List.<JCTypeAnnotation>nil());
|
JCTypeParameter tree = new JCTypeParameter(name, bounds);
|
||||||
}
|
|
||||||
|
|
||||||
public JCTypeParameter TypeParameter(Name name, List<JCExpression> bounds, List<JCTypeAnnotation> annos) {
|
|
||||||
JCTypeParameter tree = new JCTypeParameter(name, bounds, annos);
|
|
||||||
tree.pos = pos;
|
tree.pos = pos;
|
||||||
return tree;
|
return tree;
|
||||||
}
|
}
|
||||||
|
@ -485,12 +465,6 @@ public class TreeMaker implements JCTree.Factory {
|
||||||
return tree;
|
return tree;
|
||||||
}
|
}
|
||||||
|
|
||||||
public JCTypeAnnotation TypeAnnotation(JCTree annotationType, List<JCExpression> args) {
|
|
||||||
JCTypeAnnotation tree = new JCTypeAnnotation(annotationType, args);
|
|
||||||
tree.pos = pos;
|
|
||||||
return tree;
|
|
||||||
}
|
|
||||||
|
|
||||||
public JCModifiers Modifiers(long flags, List<JCAnnotation> annotations) {
|
public JCModifiers Modifiers(long flags, List<JCAnnotation> annotations) {
|
||||||
JCModifiers tree = new JCModifiers(flags, annotations);
|
JCModifiers tree = new JCModifiers(flags, annotations);
|
||||||
boolean noFlags = (flags & (Flags.ModifierFlags | Flags.ANNOTATION)) == 0;
|
boolean noFlags = (flags & (Flags.ModifierFlags | Flags.ANNOTATION)) == 0;
|
||||||
|
@ -502,12 +476,6 @@ public class TreeMaker implements JCTree.Factory {
|
||||||
return Modifiers(flags, List.<JCAnnotation>nil());
|
return Modifiers(flags, List.<JCAnnotation>nil());
|
||||||
}
|
}
|
||||||
|
|
||||||
public JCAnnotatedType AnnotatedType(List<JCTypeAnnotation> annotations, JCExpression underlyingType) {
|
|
||||||
JCAnnotatedType tree = new JCAnnotatedType(annotations, underlyingType);
|
|
||||||
tree.pos = pos;
|
|
||||||
return tree;
|
|
||||||
}
|
|
||||||
|
|
||||||
public JCErroneous Erroneous() {
|
public JCErroneous Erroneous() {
|
||||||
return Erroneous(List.<JCTree>nil());
|
return Erroneous(List.<JCTree>nil());
|
||||||
}
|
}
|
||||||
|
@ -821,7 +789,6 @@ public class TreeMaker implements JCTree.Factory {
|
||||||
Type(mtype.getReturnType()),
|
Type(mtype.getReturnType()),
|
||||||
TypeParams(mtype.getTypeArguments()),
|
TypeParams(mtype.getTypeArguments()),
|
||||||
Params(mtype.getParameterTypes(), m),
|
Params(mtype.getParameterTypes(), m),
|
||||||
null,
|
|
||||||
Types(mtype.getThrownTypes()),
|
Types(mtype.getThrownTypes()),
|
||||||
body,
|
body,
|
||||||
null,
|
null,
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -85,7 +85,6 @@ public class TreeScanner extends Visitor {
|
||||||
scan(tree.restype);
|
scan(tree.restype);
|
||||||
scan(tree.typarams);
|
scan(tree.typarams);
|
||||||
scan(tree.params);
|
scan(tree.params);
|
||||||
scan(tree.receiverAnnotations);
|
|
||||||
scan(tree.thrown);
|
scan(tree.thrown);
|
||||||
scan(tree.defaultValue);
|
scan(tree.defaultValue);
|
||||||
scan(tree.body);
|
scan(tree.body);
|
||||||
|
@ -208,11 +207,8 @@ public class TreeScanner extends Visitor {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void visitNewArray(JCNewArray tree) {
|
public void visitNewArray(JCNewArray tree) {
|
||||||
scan(tree.annotations);
|
|
||||||
scan(tree.elemtype);
|
scan(tree.elemtype);
|
||||||
scan(tree.dims);
|
scan(tree.dims);
|
||||||
for (List<JCTypeAnnotation> annos : tree.dimAnnotations)
|
|
||||||
scan(annos);
|
|
||||||
scan(tree.elems);
|
scan(tree.elems);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -281,7 +277,6 @@ public class TreeScanner extends Visitor {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void visitTypeParameter(JCTypeParameter tree) {
|
public void visitTypeParameter(JCTypeParameter tree) {
|
||||||
scan(tree.annotations);
|
|
||||||
scan(tree.bounds);
|
scan(tree.bounds);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -305,11 +300,6 @@ public class TreeScanner extends Visitor {
|
||||||
scan(tree.args);
|
scan(tree.args);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void visitAnnotatedType(JCAnnotatedType tree) {
|
|
||||||
scan(tree.annotations);
|
|
||||||
scan(tree.underlyingType);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void visitErroneous(JCErroneous tree) {
|
public void visitErroneous(JCErroneous tree) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -283,11 +283,6 @@ public class TreeTranslator extends JCTree.Visitor {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void visitNewArray(JCNewArray tree) {
|
public void visitNewArray(JCNewArray tree) {
|
||||||
tree.annotations = translate(tree.annotations);
|
|
||||||
List<List<JCTypeAnnotation>> dimAnnos = List.nil();
|
|
||||||
for (List<JCTypeAnnotation> origDimAnnos : tree.dimAnnotations)
|
|
||||||
dimAnnos = dimAnnos.append(translate(origDimAnnos));
|
|
||||||
tree.dimAnnotations = dimAnnos;
|
|
||||||
tree.elemtype = translate(tree.elemtype);
|
tree.elemtype = translate(tree.elemtype);
|
||||||
tree.dims = translate(tree.dims);
|
tree.dims = translate(tree.dims);
|
||||||
tree.elems = translate(tree.elems);
|
tree.elems = translate(tree.elems);
|
||||||
|
@ -374,7 +369,6 @@ public class TreeTranslator extends JCTree.Visitor {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void visitTypeParameter(JCTypeParameter tree) {
|
public void visitTypeParameter(JCTypeParameter tree) {
|
||||||
tree.annotations = translate(tree.annotations);
|
|
||||||
tree.bounds = translate(tree.bounds);
|
tree.bounds = translate(tree.bounds);
|
||||||
result = tree;
|
result = tree;
|
||||||
}
|
}
|
||||||
|
@ -412,12 +406,6 @@ public class TreeTranslator extends JCTree.Visitor {
|
||||||
result = tree;
|
result = tree;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void visitAnnotatedType(JCAnnotatedType tree) {
|
|
||||||
tree.annotations = translate(tree.annotations);
|
|
||||||
tree.underlyingType = translate(tree.underlyingType);
|
|
||||||
result = tree;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void visitTree(JCTree tree) {
|
public void visitTree(JCTree tree) {
|
||||||
throw new AssertionError(tree);
|
throw new AssertionError(tree);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -26,7 +26,6 @@
|
||||||
package com.sun.tools.javap;
|
package com.sun.tools.javap;
|
||||||
|
|
||||||
import com.sun.tools.classfile.Annotation;
|
import com.sun.tools.classfile.Annotation;
|
||||||
import com.sun.tools.classfile.ExtendedAnnotation;
|
|
||||||
import com.sun.tools.classfile.Annotation.Annotation_element_value;
|
import com.sun.tools.classfile.Annotation.Annotation_element_value;
|
||||||
import com.sun.tools.classfile.Annotation.Array_element_value;
|
import com.sun.tools.classfile.Annotation.Array_element_value;
|
||||||
import com.sun.tools.classfile.Annotation.Class_element_value;
|
import com.sun.tools.classfile.Annotation.Class_element_value;
|
||||||
|
@ -77,129 +76,6 @@ public class AnnotationWriter extends BasicWriter {
|
||||||
print(")");
|
print(")");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void write(ExtendedAnnotation annot) {
|
|
||||||
write(annot, true, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void write(ExtendedAnnotation annot, boolean showOffsets, boolean resolveIndices) {
|
|
||||||
write(annot.annotation, resolveIndices);
|
|
||||||
print(": ");
|
|
||||||
write(annot.position, showOffsets);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void write(ExtendedAnnotation.Position pos, boolean showOffsets) {
|
|
||||||
print(pos.type);
|
|
||||||
|
|
||||||
switch (pos.type) {
|
|
||||||
// type case
|
|
||||||
case TYPECAST:
|
|
||||||
case TYPECAST_GENERIC_OR_ARRAY:
|
|
||||||
// object creation
|
|
||||||
case INSTANCEOF:
|
|
||||||
case INSTANCEOF_GENERIC_OR_ARRAY:
|
|
||||||
// new expression
|
|
||||||
case NEW:
|
|
||||||
case NEW_GENERIC_OR_ARRAY:
|
|
||||||
case NEW_TYPE_ARGUMENT:
|
|
||||||
case NEW_TYPE_ARGUMENT_GENERIC_OR_ARRAY:
|
|
||||||
if (showOffsets) {
|
|
||||||
print(", offset=");
|
|
||||||
print(pos.offset);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
// local variable
|
|
||||||
case LOCAL_VARIABLE:
|
|
||||||
case LOCAL_VARIABLE_GENERIC_OR_ARRAY:
|
|
||||||
print(", {");
|
|
||||||
for (int i = 0; i < pos.lvarOffset.length; ++i) {
|
|
||||||
if (i != 0) print("; ");
|
|
||||||
if (showOffsets) {
|
|
||||||
print(", start_pc=");
|
|
||||||
print(pos.lvarOffset[i]);
|
|
||||||
}
|
|
||||||
print(", length=");
|
|
||||||
print(pos.lvarLength[i]);
|
|
||||||
print(", index=");
|
|
||||||
print(pos.lvarIndex[i]);
|
|
||||||
}
|
|
||||||
print("}");
|
|
||||||
break;
|
|
||||||
// method receiver
|
|
||||||
case METHOD_RECEIVER:
|
|
||||||
// Do nothing
|
|
||||||
break;
|
|
||||||
// type parameters
|
|
||||||
case CLASS_TYPE_PARAMETER:
|
|
||||||
case METHOD_TYPE_PARAMETER:
|
|
||||||
print(", param_index=");
|
|
||||||
print(pos.parameter_index);
|
|
||||||
break;
|
|
||||||
// type parameters bound
|
|
||||||
case CLASS_TYPE_PARAMETER_BOUND:
|
|
||||||
case CLASS_TYPE_PARAMETER_BOUND_GENERIC_OR_ARRAY:
|
|
||||||
case METHOD_TYPE_PARAMETER_BOUND:
|
|
||||||
case METHOD_TYPE_PARAMETER_BOUND_GENERIC_OR_ARRAY:
|
|
||||||
print(", param_index=");
|
|
||||||
print(pos.parameter_index);
|
|
||||||
print(", bound_index=");
|
|
||||||
print(pos.bound_index);
|
|
||||||
break;
|
|
||||||
// wildcard
|
|
||||||
case WILDCARD_BOUND:
|
|
||||||
case WILDCARD_BOUND_GENERIC_OR_ARRAY:
|
|
||||||
print(", wild_card=");
|
|
||||||
print(pos.wildcard_position);
|
|
||||||
break;
|
|
||||||
// Class extends and implements clauses
|
|
||||||
case CLASS_EXTENDS:
|
|
||||||
case CLASS_EXTENDS_GENERIC_OR_ARRAY:
|
|
||||||
print(", type_index=");
|
|
||||||
print(pos.type_index);
|
|
||||||
break;
|
|
||||||
// throws
|
|
||||||
case THROWS:
|
|
||||||
print(", type_index=");
|
|
||||||
print(pos.type_index);
|
|
||||||
break;
|
|
||||||
case CLASS_LITERAL:
|
|
||||||
case CLASS_LITERAL_GENERIC_OR_ARRAY:
|
|
||||||
if (showOffsets) {
|
|
||||||
print(", offset=");
|
|
||||||
print(pos.offset);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
// method parameter: not specified
|
|
||||||
case METHOD_PARAMETER_GENERIC_OR_ARRAY:
|
|
||||||
print(", param_index=");
|
|
||||||
print(pos.parameter_index);
|
|
||||||
break;
|
|
||||||
// method type argument: wasn't specified
|
|
||||||
case METHOD_TYPE_ARGUMENT:
|
|
||||||
case METHOD_TYPE_ARGUMENT_GENERIC_OR_ARRAY:
|
|
||||||
if (showOffsets) {
|
|
||||||
print(", offset=");
|
|
||||||
print(pos.offset);
|
|
||||||
}
|
|
||||||
print(", type_index=");
|
|
||||||
print(pos.type_index);
|
|
||||||
break;
|
|
||||||
// We don't need to worry abut these
|
|
||||||
case METHOD_RETURN_GENERIC_OR_ARRAY:
|
|
||||||
case FIELD_GENERIC_OR_ARRAY:
|
|
||||||
break;
|
|
||||||
case UNKNOWN:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new AssertionError("unknown type: " + pos.type);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Append location data for generics/arrays.
|
|
||||||
if (pos.type.hasLocation()) {
|
|
||||||
print(", location=");
|
|
||||||
print(pos.location);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void write(Annotation.element_value_pair pair) {
|
public void write(Annotation.element_value_pair pair) {
|
||||||
write(pair, false);
|
write(pair, false);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -47,10 +47,8 @@ import com.sun.tools.classfile.LocalVariableTable_attribute;
|
||||||
import com.sun.tools.classfile.LocalVariableTypeTable_attribute;
|
import com.sun.tools.classfile.LocalVariableTypeTable_attribute;
|
||||||
import com.sun.tools.classfile.RuntimeInvisibleAnnotations_attribute;
|
import com.sun.tools.classfile.RuntimeInvisibleAnnotations_attribute;
|
||||||
import com.sun.tools.classfile.RuntimeInvisibleParameterAnnotations_attribute;
|
import com.sun.tools.classfile.RuntimeInvisibleParameterAnnotations_attribute;
|
||||||
import com.sun.tools.classfile.RuntimeInvisibleTypeAnnotations_attribute;
|
|
||||||
import com.sun.tools.classfile.RuntimeVisibleAnnotations_attribute;
|
import com.sun.tools.classfile.RuntimeVisibleAnnotations_attribute;
|
||||||
import com.sun.tools.classfile.RuntimeVisibleParameterAnnotations_attribute;
|
import com.sun.tools.classfile.RuntimeVisibleParameterAnnotations_attribute;
|
||||||
import com.sun.tools.classfile.RuntimeVisibleTypeAnnotations_attribute;
|
|
||||||
import com.sun.tools.classfile.Signature_attribute;
|
import com.sun.tools.classfile.Signature_attribute;
|
||||||
import com.sun.tools.classfile.SourceDebugExtension_attribute;
|
import com.sun.tools.classfile.SourceDebugExtension_attribute;
|
||||||
import com.sun.tools.classfile.SourceFile_attribute;
|
import com.sun.tools.classfile.SourceFile_attribute;
|
||||||
|
@ -392,30 +390,6 @@ public class AttributeWriter extends BasicWriter
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Void visitRuntimeVisibleTypeAnnotations(RuntimeVisibleTypeAnnotations_attribute attr, Void ignore) {
|
|
||||||
println("RuntimeVisibleTypeAnnotations:");
|
|
||||||
indent(+1);
|
|
||||||
for (int i = 0; i < attr.annotations.length; i++) {
|
|
||||||
print(i + ": ");
|
|
||||||
annotationWriter.write(attr.annotations[i]);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
indent(-1);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Void visitRuntimeInvisibleTypeAnnotations(RuntimeInvisibleTypeAnnotations_attribute attr, Void ignore) {
|
|
||||||
println("RuntimeInvisibleTypeAnnotations:");
|
|
||||||
indent(+1);
|
|
||||||
for (int i = 0; i < attr.annotations.length; i++) {
|
|
||||||
print(i + ": ");
|
|
||||||
annotationWriter.write(attr.annotations[i]);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
indent(-1);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Void visitRuntimeVisibleParameterAnnotations(RuntimeVisibleParameterAnnotations_attribute attr, Void ignore) {
|
public Void visitRuntimeVisibleParameterAnnotations(RuntimeVisibleParameterAnnotations_attribute attr, Void ignore) {
|
||||||
println("RuntimeVisibleParameterAnnotations:");
|
println("RuntimeVisibleParameterAnnotations:");
|
||||||
indent(+1);
|
indent(+1);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -64,7 +64,6 @@ class CodeWriter extends BasicWriter {
|
||||||
stackMapWriter = StackMapWriter.instance(context);
|
stackMapWriter = StackMapWriter.instance(context);
|
||||||
localVariableTableWriter = LocalVariableTableWriter.instance(context);
|
localVariableTableWriter = LocalVariableTableWriter.instance(context);
|
||||||
localVariableTypeTableWriter = LocalVariableTypeTableWriter.instance(context);
|
localVariableTypeTableWriter = LocalVariableTypeTableWriter.instance(context);
|
||||||
typeAnnotationWriter = TypeAnnotationWriter.instance(context);
|
|
||||||
options = Options.instance(context);
|
options = Options.instance(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -266,11 +265,6 @@ class CodeWriter extends BasicWriter {
|
||||||
detailWriters.add(tryBlockWriter);
|
detailWriters.add(tryBlockWriter);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options.details.contains(InstructionDetailWriter.Kind.TYPE_ANNOS)) {
|
|
||||||
typeAnnotationWriter.reset(attr);
|
|
||||||
detailWriters.add(typeAnnotationWriter);
|
|
||||||
}
|
|
||||||
|
|
||||||
return detailWriters;
|
return detailWriters;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -279,7 +273,6 @@ class CodeWriter extends BasicWriter {
|
||||||
private ConstantWriter constantWriter;
|
private ConstantWriter constantWriter;
|
||||||
private LocalVariableTableWriter localVariableTableWriter;
|
private LocalVariableTableWriter localVariableTableWriter;
|
||||||
private LocalVariableTypeTableWriter localVariableTypeTableWriter;
|
private LocalVariableTypeTableWriter localVariableTypeTableWriter;
|
||||||
private TypeAnnotationWriter typeAnnotationWriter;
|
|
||||||
private SourceWriter sourceWriter;
|
private SourceWriter sourceWriter;
|
||||||
private StackMapWriter stackMapWriter;
|
private StackMapWriter stackMapWriter;
|
||||||
private TryBlockWriter tryBlockWriter;
|
private TryBlockWriter tryBlockWriter;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
@ -42,13 +42,13 @@ public abstract class InstructionDetailWriter extends BasicWriter {
|
||||||
LOCAL_VAR_TYPES("localVariableTypes"),
|
LOCAL_VAR_TYPES("localVariableTypes"),
|
||||||
SOURCE("source"),
|
SOURCE("source"),
|
||||||
STACKMAPS("stackMaps"),
|
STACKMAPS("stackMaps"),
|
||||||
TRY_BLOCKS("tryBlocks"),
|
TRY_BLOCKS("tryBlocks");
|
||||||
TYPE_ANNOS("typeAnnotations");
|
|
||||||
Kind(String option) {
|
Kind(String option) {
|
||||||
this.option = option;
|
this.option = option;
|
||||||
}
|
}
|
||||||
final String option;
|
final String option;
|
||||||
}
|
}
|
||||||
|
|
||||||
InstructionDetailWriter(Context context) {
|
InstructionDetailWriter(Context context) {
|
||||||
super(context);
|
super(context);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,126 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
|
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
||||||
*
|
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms of the GNU General Public License version 2 only, as
|
|
||||||
* published by the Free Software Foundation. Oracle designates this
|
|
||||||
* particular file as subject to the "Classpath" exception as provided
|
|
||||||
* by Oracle in the LICENSE file that accompanied this code.
|
|
||||||
*
|
|
||||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
* version 2 for more details (a copy is included in the LICENSE file that
|
|
||||||
* accompanied this code).
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License version
|
|
||||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
||||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
*
|
|
||||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
||||||
* or visit www.oracle.com if you need additional information or have any
|
|
||||||
* questions.
|
|
||||||
*/
|
|
||||||
package com.sun.tools.javap;
|
|
||||||
|
|
||||||
import com.sun.tools.classfile.Attribute;
|
|
||||||
import com.sun.tools.classfile.Code_attribute;
|
|
||||||
import com.sun.tools.classfile.ExtendedAnnotation;
|
|
||||||
import com.sun.tools.classfile.ExtendedAnnotation.Position;
|
|
||||||
import com.sun.tools.classfile.Instruction;
|
|
||||||
import com.sun.tools.classfile.Method;
|
|
||||||
import com.sun.tools.classfile.RuntimeInvisibleTypeAnnotations_attribute;
|
|
||||||
import com.sun.tools.classfile.RuntimeTypeAnnotations_attribute;
|
|
||||||
import com.sun.tools.classfile.RuntimeVisibleTypeAnnotations_attribute;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Annotate instructions with details about type annotations.
|
|
||||||
*
|
|
||||||
* <p><b>This is NOT part of any supported API.
|
|
||||||
* If you write code that depends on this, you do so at your own risk.
|
|
||||||
* This code and its internal interfaces are subject to change or
|
|
||||||
* deletion without notice.</b>
|
|
||||||
*/
|
|
||||||
public class TypeAnnotationWriter extends InstructionDetailWriter {
|
|
||||||
public enum NoteKind { VISIBLE, INVISIBLE };
|
|
||||||
public static class Note {
|
|
||||||
Note(NoteKind kind, ExtendedAnnotation anno) {
|
|
||||||
this.kind = kind;
|
|
||||||
this.anno = anno;
|
|
||||||
}
|
|
||||||
public final NoteKind kind;
|
|
||||||
public final ExtendedAnnotation anno;
|
|
||||||
}
|
|
||||||
|
|
||||||
static TypeAnnotationWriter instance(Context context) {
|
|
||||||
TypeAnnotationWriter instance = context.get(TypeAnnotationWriter.class);
|
|
||||||
if (instance == null)
|
|
||||||
instance = new TypeAnnotationWriter(context);
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected TypeAnnotationWriter(Context context) {
|
|
||||||
super(context);
|
|
||||||
context.put(TypeAnnotationWriter.class, this);
|
|
||||||
annotationWriter = AnnotationWriter.instance(context);
|
|
||||||
classWriter = ClassWriter.instance(context);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void reset(Code_attribute attr) {
|
|
||||||
Method m = classWriter.getMethod();
|
|
||||||
pcMap = new HashMap<Integer, List<Note>>();
|
|
||||||
check(NoteKind.VISIBLE, (RuntimeVisibleTypeAnnotations_attribute) m.attributes.get(Attribute.RuntimeVisibleTypeAnnotations));
|
|
||||||
check(NoteKind.INVISIBLE, (RuntimeInvisibleTypeAnnotations_attribute) m.attributes.get(Attribute.RuntimeInvisibleTypeAnnotations));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void check(NoteKind kind, RuntimeTypeAnnotations_attribute attr) {
|
|
||||||
if (attr == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (ExtendedAnnotation anno: attr.annotations) {
|
|
||||||
Position p = anno.position;
|
|
||||||
Note note = null;
|
|
||||||
if (p.offset != -1)
|
|
||||||
addNote(p.offset, note = new Note(kind, anno));
|
|
||||||
if (p.lvarOffset != null) {
|
|
||||||
for (int i = 0; i < p.lvarOffset.length; i++) {
|
|
||||||
if (note == null)
|
|
||||||
note = new Note(kind, anno);
|
|
||||||
addNote(p.lvarOffset[i], note);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void addNote(int pc, Note note) {
|
|
||||||
List<Note> list = pcMap.get(pc);
|
|
||||||
if (list == null)
|
|
||||||
pcMap.put(pc, list = new ArrayList<Note>());
|
|
||||||
list.add(note);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
void writeDetails(Instruction instr) {
|
|
||||||
String indent = space(2); // get from Options?
|
|
||||||
int pc = instr.getPC();
|
|
||||||
List<Note> notes = pcMap.get(pc);
|
|
||||||
if (notes != null) {
|
|
||||||
for (Note n: notes) {
|
|
||||||
print(indent);
|
|
||||||
print("@");
|
|
||||||
annotationWriter.write(n.anno, false, true);
|
|
||||||
print(", ");
|
|
||||||
println(n.kind.toString().toLowerCase());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private AnnotationWriter annotationWriter;
|
|
||||||
private ClassWriter classWriter;
|
|
||||||
private Map<Integer, List<Note>> pcMap;
|
|
||||||
}
|
|
|
@ -52,7 +52,6 @@ compiler.misc.bad.const.pool.tag.at # bad class file
|
||||||
compiler.misc.bad.enclosing.method # bad class file
|
compiler.misc.bad.enclosing.method # bad class file
|
||||||
compiler.misc.bad.runtime.invisible.param.annotations # bad class file
|
compiler.misc.bad.runtime.invisible.param.annotations # bad class file
|
||||||
compiler.misc.bad.signature # bad class file
|
compiler.misc.bad.signature # bad class file
|
||||||
compiler.misc.bad.type.annotation.value
|
|
||||||
compiler.misc.base.membership # UNUSED
|
compiler.misc.base.membership # UNUSED
|
||||||
compiler.misc.ccf.found.later.version
|
compiler.misc.ccf.found.later.version
|
||||||
compiler.misc.ccf.unrecognized.attribute
|
compiler.misc.ccf.unrecognized.attribute
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue