123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- /*
- * Javassist, a Java-bytecode translator toolkit.
- * Copyright (C) 1999- Shigeru Chiba. All Rights Reserved.
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. Alternatively, the contents of this file may be used under
- * the terms of the GNU Lesser General Public License Version 2.1 or later,
- * or the Apache License Version 2.0.
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- */
- package javassist.bytecode.analysis;
-
- import javassist.ClassPool;
- import javassist.CtClass;
- import javassist.NotFoundException;
-
- /**
- * Represents an array of {@link MultiType} instances.
- *
- * @author Jason T. Greene
- */
- public class MultiArrayType extends Type {
- private MultiType component;
- private int dims;
-
- public MultiArrayType(MultiType component, int dims) {
- super(null);
- this.component = component;
- this.dims = dims;
- }
-
- public CtClass getCtClass() {
- CtClass clazz = component.getCtClass();
- if (clazz == null)
- return null;
-
- ClassPool pool = clazz.getClassPool();
- if (pool == null)
- pool = ClassPool.getDefault();
-
- String name = arrayName(clazz.getName(), dims);
-
- try {
- return pool.get(name);
- } catch (NotFoundException e) {
- throw new RuntimeException(e);
- }
- }
-
- boolean popChanged() {
- return component.popChanged();
- }
-
- public int getDimensions() {
- return dims;
- }
-
- public Type getComponent() {
- return dims == 1 ? (Type)component : new MultiArrayType(component, dims - 1);
- }
-
- public int getSize() {
- return 1;
- }
-
- public boolean isArray() {
- return true;
- }
-
- public boolean isAssignableFrom(Type type) {
- throw new UnsupportedOperationException("Not implemented");
- }
-
- public boolean isReference() {
- return true;
- }
-
- public boolean isAssignableTo(Type type) {
- if (eq(type.getCtClass(), Type.OBJECT.getCtClass()))
- return true;
-
- if (eq(type.getCtClass(), Type.CLONEABLE.getCtClass()))
- return true;
-
- if (eq(type.getCtClass(), Type.SERIALIZABLE.getCtClass()))
- return true;
-
- if (! type.isArray())
- return false;
-
- Type typeRoot = getRootComponent(type);
- int typeDims = type.getDimensions();
-
- if (typeDims > dims)
- return false;
-
- if (typeDims < dims) {
- if (eq(typeRoot.getCtClass(), Type.OBJECT.getCtClass()))
- return true;
-
- if (eq(typeRoot.getCtClass(), Type.CLONEABLE.getCtClass()))
- return true;
-
- if (eq(typeRoot.getCtClass(), Type.SERIALIZABLE.getCtClass()))
- return true;
-
- return false;
- }
-
- return component.isAssignableTo(typeRoot);
- }
-
- public boolean equals(Object o) {
- if (! (o instanceof MultiArrayType))
- return false;
- MultiArrayType multi = (MultiArrayType)o;
-
- return component.equals(multi.component) && dims == multi.dims;
- }
-
- public String toString() {
- // follows the same detailed formating scheme as component
- return arrayName(component.toString(), dims);
- }
- }
|