| /********************************************************************** |
| * This file is part of "Object Teams Development Tooling"-Software |
| * |
| * Copyright 2004, 2006 Fraunhofer Gesellschaft, Munich, Germany, |
| * for its Fraunhofer Institute for Computer Architecture and Software |
| * Technology (FIRST), Berlin, Germany and Technical University Berlin, |
| * Germany. |
| * |
| * This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * $Id: TypeContainerMethod.java 19873 2009-04-13 16:51:05Z stephan $ |
| * |
| * Please visit http://www.eclipse.org/objectteams for updates and contact. |
| * |
| * Contributors: |
| * Fraunhofer FIRST - Initial API and implementation |
| * Technical University Berlin - Initial API and implementation |
| **********************************************************************/ |
| package org.eclipse.objectteams.otdt.internal.core.compiler.ast; |
| |
| import org.eclipse.jdt.core.compiler.CharOperation; |
| import org.eclipse.jdt.internal.compiler.ASTVisitor; |
| import org.eclipse.jdt.internal.compiler.ClassFile; |
| import org.eclipse.jdt.internal.compiler.CompilationResult; |
| import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration; |
| import org.eclipse.jdt.internal.compiler.ast.MethodDeclaration; |
| import org.eclipse.jdt.internal.compiler.ast.Statement; |
| import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration; |
| import org.eclipse.jdt.internal.compiler.ast.TypeReference; |
| import org.eclipse.jdt.internal.compiler.codegen.CodeStream; |
| import org.eclipse.jdt.internal.compiler.lookup.ClassScope; |
| import org.eclipse.jdt.internal.compiler.lookup.MethodBinding; |
| import org.eclipse.jdt.internal.compiler.lookup.TypeIds; |
| import org.eclipse.jdt.internal.compiler.parser.Parser; |
| |
| /** |
| * NEW for OTDT. |
| * |
| * This class is used to wrap local types of roles in a method during copy inheritance. |
| * |
| * Why: During copy inheritance we need an AST-node contained in the role class, |
| * which triggers code generation (ie., copyAdjustBytecode()). |
| * Without the TypeContainerMethod we would simply not find local types, |
| * since the method originally defining this local type is available only |
| * as a MethodBinding, not its AST. |
| * |
| * @version $Id: TypeContainerMethod.java 19873 2009-04-13 16:51:05Z stephan $ |
| * @author stephan |
| */ |
| public class TypeContainerMethod extends MethodDeclaration { |
| |
| private final static char[] SELECTOR = "<type wrapper>".toCharArray(); //$NON-NLS-1$ |
| /** |
| * @param compilationResult |
| * @param localType the type to wrap |
| */ |
| public TypeContainerMethod(CompilationResult compilationResult, TypeDeclaration localType) |
| { |
| super(compilationResult); |
| setStatements(new Statement[] {localType}); |
| this.selector = SELECTOR; |
| this.isGenerated = true; |
| this.returnType = TypeReference.baseTypeReference(TypeIds.T_void, 0, null); |
| } |
| |
| @Override |
| public void parseStatements(Parser parser, CompilationUnitDeclaration unit) { |
| // NO-OP. (there is no source at all) |
| } |
| |
| /** |
| * Override method from AbstractMethodDeclaration: only generate code |
| * for the wrapped type, not for the method itself. |
| */ |
| @Override |
| public void generateCode(ClassScope classScope, ClassFile classFile) { |
| CodeStream codeStream = classFile.codeStream; |
| codeStream.reset(this, classFile); |
| this.statements[0].generateCode(this.scope, codeStream); |
| } |
| |
| @Override |
| public void traverse( |
| ASTVisitor visitor, |
| ClassScope classScope) |
| { |
| // NO-OP |
| // do nothing because otherwise TransformStatementsTransformer would |
| // again add the type to RoleModel._localTypes, where it is already contained. |
| } |
| |
| @Override |
| public void resolve(ClassScope upperScope) { |
| // NO-OP |
| } |
| /** |
| * Is method a type container method? |
| */ |
| public static boolean isTypeContainer(MethodBinding method) { |
| return CharOperation.equals(method.selector, SELECTOR); |
| } |
| } |