org.codehaus.groovy.ast.ClassHelper Maven / Gradle / Ivy
The newest version!
/*
* Copyright 2003-2007 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.codehaus.groovy.ast;
import groovy.lang.*;
import org.codehaus.groovy.runtime.GeneratedClosure;
import org.codehaus.groovy.util.ManagedConcurrentMap;
import org.codehaus.groovy.util.ReferenceBundle;
import org.codehaus.groovy.vmplugin.VMPluginFactory;
import org.objectweb.asm.Opcodes;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
import java.lang.ref.SoftReference;
/**
* This class is a Helper for ClassNode and classes handling ClassNodes.
* It does contain a set of predefined ClassNodes for the most used
* types and some code for cached ClassNode creation and basic
* ClassNode handling
*
* @author Jochen Theodorou
*/
public class ClassHelper {
private static final Class[] classes = new Class[] {
Object.class, Boolean.TYPE, Character.TYPE, Byte.TYPE, Short.TYPE,
Integer.TYPE, Long.TYPE, Double.TYPE, Float.TYPE, Void.TYPE,
Closure.class, GString.class, List.class, Map.class, Range.class,
Pattern.class, Script.class, String.class, Boolean.class,
Character.class, Byte.class, Short.class, Integer.class, Long.class,
Double.class, Float.class, BigDecimal.class, BigInteger.class,
Number.class, Void.class, Reference.class, Class.class, MetaClass.class,
Iterator.class, GeneratedClosure.class, GroovyObjectSupport.class
};
private static final String[] primitiveClassNames = new String[] {
"", "boolean", "char", "byte", "short",
"int", "long", "double", "float", "void"
};
public static final ClassNode
DYNAMIC_TYPE = makeCached(Object.class), OBJECT_TYPE = DYNAMIC_TYPE,
VOID_TYPE = makeCached(Void.TYPE), CLOSURE_TYPE = makeCached(Closure.class),
GSTRING_TYPE = makeCached(GString.class), LIST_TYPE = makeWithoutCaching(List.class),
MAP_TYPE = makeWithoutCaching(Map.class), RANGE_TYPE = makeCached(Range.class),
PATTERN_TYPE = makeCached(Pattern.class), STRING_TYPE = makeCached(String.class),
SCRIPT_TYPE = makeCached(Script.class), REFERENCE_TYPE = makeWithoutCaching(Reference.class),
boolean_TYPE = makeCached(boolean.class), char_TYPE = makeCached(char.class),
byte_TYPE = makeCached(byte.class), int_TYPE = makeCached(int.class),
long_TYPE = makeCached(long.class), short_TYPE = makeCached(short.class),
double_TYPE = makeCached(double.class), float_TYPE = makeCached(float.class),
Byte_TYPE = makeCached(Byte.class), Short_TYPE = makeCached(Short.class),
Integer_TYPE = makeCached(Integer.class), Long_TYPE = makeCached(Long.class),
Character_TYPE = makeCached(Character.class), Float_TYPE = makeCached(Float.class),
Double_TYPE = makeCached(Double.class), Boolean_TYPE = makeCached(Boolean.class),
BigInteger_TYPE = makeCached(java.math.BigInteger.class),
BigDecimal_TYPE = makeCached(java.math.BigDecimal.class),
Number_TYPE = makeCached(Number.class),
void_WRAPPER_TYPE = makeCached(Void.class), METACLASS_TYPE = makeCached(MetaClass.class),
Iterator_TYPE = makeCached(Iterator.class),
// uncached constants.
CLASS_Type = makeWithoutCaching(Class.class), COMPARABLE_TYPE = makeWithoutCaching(Comparable.class),
GENERATED_CLOSURE_Type = makeWithoutCaching(GeneratedClosure.class),
GROOVY_OBJECT_SUPPORT_TYPE = makeWithoutCaching(GroovyObjectSupport.class),
GROOVY_OBJECT_TYPE = makeWithoutCaching(GroovyObject.class),
GROOVY_INTERCEPTABLE_TYPE = makeWithoutCaching(GroovyInterceptable.class),
Enum_Type = new ClassNode("java.lang.Enum",0,OBJECT_TYPE),
Annotation_TYPE = new ClassNode("java.lang.annotation.Annotation",0,OBJECT_TYPE),
ELEMENT_TYPE_TYPE = new ClassNode("java.lang.annotation.ElementType",0,Enum_Type)
;
static {
Enum_Type.isPrimaryNode = false;
Annotation_TYPE.isPrimaryNode = false;
}
private static ClassNode[] types = new ClassNode[] {
OBJECT_TYPE,
boolean_TYPE, char_TYPE, byte_TYPE, short_TYPE,
int_TYPE, long_TYPE, double_TYPE, float_TYPE,
VOID_TYPE, CLOSURE_TYPE, GSTRING_TYPE,
LIST_TYPE, MAP_TYPE, RANGE_TYPE, PATTERN_TYPE,
SCRIPT_TYPE, STRING_TYPE, Boolean_TYPE, Character_TYPE,
Byte_TYPE, Short_TYPE, Integer_TYPE, Long_TYPE,
Double_TYPE, Float_TYPE, BigDecimal_TYPE, BigInteger_TYPE,
Number_TYPE,
void_WRAPPER_TYPE, REFERENCE_TYPE, CLASS_Type, METACLASS_TYPE,
Iterator_TYPE, GENERATED_CLOSURE_Type, GROOVY_OBJECT_SUPPORT_TYPE,
GROOVY_OBJECT_TYPE, GROOVY_INTERCEPTABLE_TYPE, Enum_Type, Annotation_TYPE
};
protected static final ClassNode[] EMPTY_TYPE_ARRAY = {};
public static final String OBJECT = "java.lang.Object";
public static ClassNode makeCached(Class c){
final SoftReference classNodeSoftReference = ClassHelperCache.classCache.get(c);
ClassNode classNode;
if (classNodeSoftReference == null || (classNode = classNodeSoftReference.get()) == null) {
classNode = new ClassNode(c);
ClassHelperCache.classCache.put(c, new SoftReference(classNode));
VMPluginFactory.getPlugin().setAdditionalClassInformation(classNode);
}
return classNode;
}
/**
* Creates an array of ClassNodes using an array of classes.
* For each of the given classes a new ClassNode will be
* created
* @see #make(Class)
* @param classes an array of classes used to create the ClassNodes
* @return an array of ClassNodes
*/
public static ClassNode[] make(Class[] classes) {
ClassNode[] cns = new ClassNode[classes.length];
for (int i=0; i> classCache = new ManagedConcurrentMap>(ReferenceBundle.getWeakBundle());
}
}