view graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/GeneratedTypeMirror.java @ 16755:bd28da642eea

Truffle-DSL: Several new features implemented: Implementation of a new code generation layout which shares code between generated nodes. Declaration order of specializations is now used as specialization order. Specializations do no longer perform fallthrough on respecialization, they now always respecialize from the first specialization. Implemented support for contains relations between specializations. Improved reachability error messages. Preliminary support for @Implies.
author Christian Humer <christian.humer@gmail.com>
date Mon, 11 Aug 2014 15:53:05 +0200
parents
children
line wrap: on
line source

package com.oracle.truffle.dsl.processor.node;

import java.util.*;

import javax.lang.model.element.*;
import javax.lang.model.type.*;

import com.oracle.truffle.dsl.processor.ast.*;
import com.oracle.truffle.dsl.processor.ast.CodeTypeMirror.*;

public final class GeneratedTypeMirror extends DeclaredCodeTypeMirror {

    public GeneratedTypeMirror(String packageName, String name) {
        super(new GeneratedTypeElement(Collections.<Modifier> emptySet(), ElementKind.CLASS, new GeneratedPackageElement(packageName), name));
    }

    public static final class GeneratedPackageElement extends CodeElement<Element> implements PackageElement {

        private final Name qualifiedName;
        private final Name simpleName;

        public GeneratedPackageElement(String qualifiedName) {
            this.qualifiedName = CodeNames.of(qualifiedName);
            int lastIndex = qualifiedName.lastIndexOf('.');
            if (lastIndex == -1) {
                simpleName = CodeNames.of("");
            } else {
                simpleName = CodeNames.of(qualifiedName.substring(lastIndex, qualifiedName.length()));
            }
        }

        public TypeMirror asType() {
            throw new UnsupportedOperationException();
        }

        public ElementKind getKind() {
            return ElementKind.PACKAGE;
        }

        public <R, P> R accept(ElementVisitor<R, P> v, P p) {
            return v.visitPackage(this, p);
        }

        public Name getQualifiedName() {
            return qualifiedName;
        }

        public Name getSimpleName() {
            return simpleName;
        }

        public boolean isUnnamed() {
            return simpleName.toString().equals("");
        }

        @Override
        public int hashCode() {
            return qualifiedName.hashCode();
        }

        @Override
        public boolean equals(Object obj) {
            if (obj instanceof PackageElement) {
                return qualifiedName.equals(((PackageElement) obj).getQualifiedName());
            }
            return super.equals(obj);
        }
    }

    public static final class GeneratedTypeElement extends CodeTypeElement {

        public GeneratedTypeElement(Set<Modifier> modifiers, ElementKind kind, PackageElement packageElement, String simpleName) {
            super(modifiers, kind, packageElement, simpleName);
            setEnclosingElement(packageElement);
        }

    }

}