| /******************************************************************************* |
| * Copyright (c) 2007, 2014 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.pde.api.tools.internal.comparator; |
| |
| import org.objectweb.asm.Opcodes; |
| import org.objectweb.asm.signature.SignatureVisitor; |
| |
| /** |
| * This class is used to decode a generic signature for class or method |
| */ |
| final class SignatureDecoder extends SignatureVisitor { |
| static final int CLASS_BOUND = 1; |
| static final int DEFAULT = 0; |
| static final int INTERFACE_BOUND = 2; |
| static final int SUPER_CLASS = 3; |
| static final int NORMAL_TYPE_ARGUMENT = 4; |
| static final int EXTENDS_TYPE_ARGUMENT = 5; |
| static final int SUPER_TYPE_ARGUMENT = 6; |
| |
| int mode = DEFAULT; |
| SignatureDescriptor signatureDescriptor; |
| |
| public SignatureDecoder(SignatureDescriptor signatureDescriptor) { |
| super(Opcodes.ASM5); |
| this.signatureDescriptor = signatureDescriptor; |
| } |
| |
| @Override |
| public SignatureVisitor visitArrayType() { |
| return this; |
| } |
| |
| @Override |
| public void visitBaseType(char descriptor) { |
| // nothing to do |
| } |
| |
| @Override |
| public SignatureVisitor visitClassBound() { |
| this.mode = CLASS_BOUND; |
| return this; |
| } |
| |
| @Override |
| public void visitClassType(String name) { |
| String classTypeName = name.replace('/', '.'); |
| switch (this.mode) { |
| case CLASS_BOUND: |
| this.signatureDescriptor.setClassBound(classTypeName); |
| break; |
| case INTERFACE_BOUND: |
| this.signatureDescriptor.addInterfaceBound(classTypeName); |
| break; |
| case SUPER_CLASS: |
| this.signatureDescriptor.setSuperclass(classTypeName); |
| break; |
| case EXTENDS_TYPE_ARGUMENT: |
| case SUPER_TYPE_ARGUMENT: |
| case NORMAL_TYPE_ARGUMENT: |
| this.signatureDescriptor.addTypeArgument(classTypeName); |
| break; |
| default: |
| break; |
| } |
| this.mode = DEFAULT; |
| } |
| |
| @Override |
| public void visitEnd() { |
| // nothing to do |
| } |
| |
| @Override |
| public SignatureVisitor visitExceptionType() { |
| // nothing to do |
| return this; |
| } |
| |
| @Override |
| public void visitFormalTypeParameter(String name) { |
| this.signatureDescriptor.addTypeParameterDescriptor(name); |
| } |
| |
| @Override |
| public void visitInnerClassType(String name) { |
| } |
| |
| @Override |
| public SignatureVisitor visitInterface() { |
| return this; |
| } |
| |
| @Override |
| public SignatureVisitor visitInterfaceBound() { |
| this.mode = INTERFACE_BOUND; |
| return this; |
| } |
| |
| @Override |
| public SignatureVisitor visitParameterType() { |
| return this; |
| } |
| |
| @Override |
| public SignatureVisitor visitReturnType() { |
| return this; |
| } |
| |
| @Override |
| public SignatureVisitor visitSuperclass() { |
| this.mode = SUPER_CLASS; |
| return this; |
| } |
| |
| @Override |
| public void visitTypeArgument() { |
| } |
| |
| @Override |
| public SignatureVisitor visitTypeArgument(char wildcard) { |
| switch (wildcard) { |
| case SignatureVisitor.EXTENDS: |
| this.mode = EXTENDS_TYPE_ARGUMENT; |
| break; |
| case SignatureVisitor.SUPER: |
| this.mode = SUPER_TYPE_ARGUMENT; |
| break; |
| case SignatureVisitor.INSTANCEOF: |
| this.mode = NORMAL_TYPE_ARGUMENT; |
| break; |
| default: |
| break; |
| } |
| return this; |
| } |
| |
| @Override |
| public void visitTypeVariable(String name) { |
| } |
| } |