org.eclipse.pde.api.tools.internal.comparator.SignatureDecoder.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.pde.api.tools.internal.comparator.SignatureDecoder.java

Source

/*******************************************************************************
 * 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) {
    }
}