org.aspectj.org.eclipse.jdt.internal.core.builder.CompilationParticipantResult Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of aspectjtools Show documentation
Show all versions of aspectjtools Show documentation
AspectJ tools most notably contains the AspectJ compiler (AJC). AJC applies aspects to Java classes during
compilation, fully replacing Javac for plain Java classes and also compiling native AspectJ or annotation-based
@AspectJ syntax. Furthermore, AJC can weave aspects into existing class files in a post-compile binary weaving step.
This library is a superset of AspectJ weaver and hence also of AspectJ runtime.
/*******************************************************************************
* Copyright (c) 2005, 2023 IBM Corporation and others.
*
* 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
*
* Contributors:
* IBM - rewrote spec
* Christoph Läubrich - Enhance the BuildContext with the discovered annotations #674
*******************************************************************************/
package org.aspectj.org.eclipse.jdt.internal.core.builder;
import org.eclipse.core.resources.IFile;
import org.aspectj.org.eclipse.jdt.core.compiler.*;
import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding;
import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
public class CompilationParticipantResult extends BuildContext {
protected SourceFile sourceFile;
protected AnnotationBinding[] annotations; // only set during processAnnotations
protected IFile[] addedFiles; // added/changed generated source files that need to be compiled
protected IFile[] deletedFiles; // previously generated source files that should be deleted
protected CategorizedProblem[] problems; // new problems to report against this compilationUnit
protected String[] dependencies; // fully-qualified type names of any new dependencies, each name is of the form 'p1.p2.A.B'
private final boolean isTestCode;
protected CompilationParticipantResult(SourceFile sourceFile, boolean isTestCode) {
this.sourceFile = sourceFile;
this.isTestCode = isTestCode;
this.annotations = null;
this.addedFiles = null;
this.deletedFiles = null;
this.problems = null;
this.dependencies = null;
}
/**
* Returns the contents of the compilation unit.
*
* @return the contents of the compilation unit
*/
@Override
public char[] getContents() {
return this.sourceFile.getContents();
}
/**
* Returns the IFile
representing the compilation unit.
*
* @return the IFile
representing the compilation unit
*/
@Override
public IFile getFile() {
return this.sourceFile.resource;
}
/**
* Returns whether the compilation unit contained any annotations when it was compiled.
*
* NOTE: This is only valid during {@link CompilationParticipant#processAnnotations(BuildContext[])}.
*
* @return whether the compilation unit contained any annotations when it was compiled
*/
@Override
public boolean hasAnnotations() {
return this.annotations != null; // only set during processAnnotations
}
@Override
public boolean hasAnnotations(String fqn) {
if (this.annotations != null) {
for (AnnotationBinding binding : this.annotations) {
if (binding == null) {
continue;
}
ReferenceBinding type = binding.getAnnotationType();
if (type == null || type.compoundName == null) {
continue;
}
if (fqn.equals(new String(CharOperation.concatWith(type.compoundName, '.')))) {
return true;
}
}
}
return false;
}
/**
* Record the added/changed generated files that need to be compiled.
*
* @param addedGeneratedFiles the added/changed files
*/
@Override
public void recordAddedGeneratedFiles(IFile[] addedGeneratedFiles) {
int length2 = addedGeneratedFiles.length;
if (length2 == 0) return;
int length1 = this.addedFiles == null ? 0 : this.addedFiles.length;
IFile[] merged = new IFile[length1 + length2];
if (length1 > 0) // always make a copy even if currently empty
System.arraycopy(this.addedFiles, 0, merged, 0, length1);
System.arraycopy(addedGeneratedFiles, 0, merged, length1, length2);
this.addedFiles = merged;
}
/**
* Record the generated files that need to be deleted.
*
* @param deletedGeneratedFiles the files that need to be deleted
*/
@Override
public void recordDeletedGeneratedFiles(IFile[] deletedGeneratedFiles) {
int length2 = deletedGeneratedFiles.length;
if (length2 == 0) return;
int length1 = this.deletedFiles == null ? 0 : this.deletedFiles.length;
IFile[] merged = new IFile[length1 + length2];
if (length1 > 0) // always make a copy even if currently empty
System.arraycopy(this.deletedFiles, 0, merged, 0, length1);
System.arraycopy(deletedGeneratedFiles, 0, merged, length1, length2);
this.deletedFiles = merged;
}
/**
* Record the fully-qualified type names of any new dependencies, each name is of the form "p1.p2.A.B".
*
* @param typeNameDependencies the fully-qualified type names of new dependencies
*/
@Override
public void recordDependencies(String[] typeNameDependencies) {
int length2 = typeNameDependencies.length;
if (length2 == 0) return;
int length1 = this.dependencies == null ? 0 : this.dependencies.length;
String[] merged = new String[length1 + length2];
if (length1 > 0) // always make a copy even if currently empty
System.arraycopy(this.dependencies, 0, merged, 0, length1);
System.arraycopy(typeNameDependencies, 0, merged, length1, length2);
this.dependencies = merged;
}
/**
* Record new problems to report against this compilationUnit.
* Markers are persisted for these problems only for the declared managed marker type
* (see the 'compilationParticipant' extension point).
*
* @param newProblems the problems to report
*/
@Override
public void recordNewProblems(CategorizedProblem[] newProblems) {
int length2 = newProblems.length;
if (length2 == 0) return;
int length1 = this.problems == null ? 0 : this.problems.length;
CategorizedProblem[] merged = new CategorizedProblem[length1 + length2];
if (length1 > 0) // always make a copy even if currently empty
System.arraycopy(this.problems, 0, merged, 0, length1);
System.arraycopy(newProblems, 0, merged, length1, length2);
this.problems = merged;
}
void reset(AnnotationBinding[] newAnnotations) {
// called prior to processAnnotations
this.annotations = newAnnotations;
this.addedFiles = null;
this.deletedFiles = null;
this.problems = null;
this.dependencies = null;
}
@Override
public String toString() {
return this.sourceFile.toString();
}
@Override
public boolean isTestCode() {
return this.isTestCode;
}
}