org.codehaus.groovy.eclipse.editor.outline.OMethod.java Source code

Java tutorial

Introduction

Here is the source code for org.codehaus.groovy.eclipse.editor.outline.OMethod.java

Source

/*
 * Copyright 2003-2009 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.eclipse.editor.outline;

import org.codehaus.groovy.ast.ASTNode;
import org.codehaus.jdt.groovy.model.GroovyCompilationUnit;
import org.eclipse.core.runtime.Assert;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.ISourceRange;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.SourceRange;
import org.eclipse.jdt.internal.core.JavaElement;
import org.eclipse.jdt.internal.core.SourceMethod;
import org.eclipse.jdt.internal.core.SourceMethodInfo;

/**
 * @author maxime hamm
 * @created 1 avr. 2011
 */
public abstract class OMethod extends SourceMethod implements IOJavaElement {

    protected ASTNode node;

    private OMethodInfo cachedInfo;

    /**
     * @param parent the parent type
     * @param node the node that matches the whole method source source (not
     *            only the method name or method signature but also the method
     *            body)
     * @param name the method name
     */
    public OMethod(JavaElement parent, ASTNode node, String name) {
        super(parent, name, null);
        this.node = node;
    }

    public ASTNode getNode() {
        return node;
    }

    /**
     * The element name node.
     * i.e the node that will be highlighted int the editor when you will select
     * the method in the outline view
     *
     * @return
     */
    public ASTNode getElementNameNode() {
        return node;
    }

    /**
     * @return The return type to display.
     */
    public abstract String getReturnTypeName();

    @Override
    public Object getElementInfo() throws JavaModelException {
        if (cachedInfo == null) {
            cachedInfo = (OMethodInfo) createElementInfo();
        }
        return cachedInfo;
    }

    @Override
    protected Object createElementInfo() {
        return new OMethodInfo();
    }

    public GroovyCompilationUnit getUnit() {
        ICompilationUnit unit = (ICompilationUnit) getAncestor(IJavaElement.COMPILATION_UNIT);
        if (unit instanceof GroovyCompilationUnit) {
            return (GroovyCompilationUnit) unit;
        } else {
            Assert.isTrue(false, "Expecting GroovyCompilationUnit, but found " + unit);
            return null; // won't get here
        }
    }

    @Override
    public String[] getCategories() throws JavaModelException {
        // categories not supported
        //        if (exists()) {
        //            return super.getCategories();
        //        }
        return NO_CATEGORIES;
    }

    /****************************************************************************
     * @author maxime hamm
     * @created 3 avr. 2011
     */
    public class OMethodInfo extends SourceMethodInfo {

        @Override
        public int getNameSourceStart() {
            return getElementNameNode().getStart();
        }

        @Override
        public int getNameSourceEnd() {
            return getNameSourceStart() + getElementNameNode().getLength();
        }

        @Override
        public int getDeclarationSourceStart() {
            return node.getStart();
        }

        @Override
        public int getDeclarationSourceEnd() {
            return node.getEnd();
        }

        @Override
        protected ISourceRange getSourceRange() {
            return new SourceRange(node.getStart(), node.getLength());
        }

        @Override
        public char[] getReturnTypeName() {
            return OMethod.this.getReturnTypeName().toCharArray();
        }
    }

}