Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

introduces CtModel for #584 #589

Merged
merged 2 commits into from
Apr 22, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions src/main/java/spoon/Launcher.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,18 @@
import com.martiansoftware.jsap.JSAPResult;
import com.martiansoftware.jsap.Switch;
import com.martiansoftware.jsap.stringparsers.FileStringParser;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;

import spoon.compiler.Environment;
import spoon.compiler.SpoonCompiler;
import spoon.compiler.SpoonResource;
import spoon.compiler.SpoonResourceHelper;
import spoon.processing.Processor;
import spoon.reflect.CtModel;
import spoon.reflect.declaration.CtElement;
import spoon.reflect.declaration.CtType;
import spoon.reflect.factory.Factory;
Expand Down Expand Up @@ -767,4 +770,9 @@ public void setBinaryOutputDirectory(File outputDirectory) {
modelBuilder.setBinaryOutputDirectory(outputDirectory);
}

@Override
public CtModel getModel() {
return factory.getModel();
}

}
8 changes: 6 additions & 2 deletions src/main/java/spoon/SpoonAPI.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,17 @@
*/
package spoon;

import java.io.File;

import spoon.compiler.Environment;
import spoon.compiler.SpoonCompiler;
import spoon.processing.Processor;
import spoon.reflect.CtModel;
import spoon.reflect.declaration.CtElement;
import spoon.reflect.declaration.CtType;
import spoon.reflect.factory.Factory;
import spoon.reflect.visitor.Filter;

import java.io.File;

/**
* Is the core entry point of Spoon. Implemented by Launcher.
*/
Expand Down Expand Up @@ -144,4 +145,7 @@ public interface SpoonAPI {
* Creates a new Spoon compiler (for building the model)
*/
SpoonCompiler createCompiler();

/** Returns the model built from the sources given via {@link #addInputResource(String)} */
CtModel getModel();
}
48 changes: 48 additions & 0 deletions src/main/java/spoon/reflect/CtModel.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
/**
* Copyright (C) 2006-2015 INRIA and contributors
* Spoon - http://spoon.gforge.inria.fr/
*
* This software is governed by the CeCILL-C License under French law and
* abiding by the rules of distribution of free software. You can use, modify
* and/or redistribute the software under the terms of the CeCILL-C license as
* circulated by CEA, CNRS and INRIA at http://www.cecill.info.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details.
*
* The fact that you are presently reading this means that you have had
* knowledge of the CeCILL-C license and that you accept its terms.
*/
package spoon.reflect;

import java.util.Collection;
import java.util.List;

import spoon.processing.Processor;
import spoon.reflect.declaration.CtElement;
import spoon.reflect.declaration.CtPackage;
import spoon.reflect.declaration.CtType;
import spoon.reflect.visitor.Filter;

/** represents a Java program, modeled by a set of compile-time (Ct) objects
* where each objects is a program element (for instance, a CtClass represents a class).
*/
public interface CtModel {

/** returns the root package */
CtPackage getRootPackage();

/** returns all top-level types of the model */
Collection<CtType<?>> getAllTypes();

/** returns all packages of the model */
Collection<CtPackage> getAllPackages();

/** process this model with the given processor */
void processWith(Processor<?> processor);

/** Returns all the model elements matching the filter. */
<E extends CtElement> List<E> getElements(Filter<E> filter);

}
110 changes: 110 additions & 0 deletions src/main/java/spoon/reflect/CtModelImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
/**
* Copyright (C) 2006-2015 INRIA and contributors
* Spoon - http://spoon.gforge.inria.fr/
*
* This software is governed by the CeCILL-C License under French law and
* abiding by the rules of distribution of free software. You can use, modify
* and/or redistribute the software under the terms of the CeCILL-C license as
* circulated by CEA, CNRS and INRIA at http://www.cecill.info.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL-C License for more details.
*
* The fact that you are presently reading this means that you have had
* knowledge of the CeCILL-C license and that you accept its terms.
*/
package spoon.reflect;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

import spoon.processing.Processor;
import spoon.reflect.declaration.CtElement;
import spoon.reflect.declaration.CtPackage;
import spoon.reflect.declaration.CtType;
import spoon.reflect.declaration.ParentNotInitializedException;
import spoon.reflect.factory.Factory;
import spoon.reflect.visitor.CtVisitor;
import spoon.reflect.visitor.Filter;
import spoon.reflect.visitor.filter.TypeFilter;
import spoon.support.QueueProcessingManager;
import spoon.support.reflect.declaration.CtElementImpl;
import spoon.support.reflect.declaration.CtPackageImpl;

public class CtModelImpl implements CtModel {

private static class CtRootPackage extends CtPackageImpl {
{
this.setSimpleName(CtPackage.TOP_LEVEL_PACKAGE_NAME);
this.setParent(new CtElementImpl() {
@Override
public void accept(CtVisitor visitor) {

}

@Override
public CtElement getParent() throws ParentNotInitializedException {
return null;
}
});
}

@Override
public String getSimpleName() {
return super.getSimpleName();
}

@Override
public String getQualifiedName() {
return "";
}

@Override
public String toString() {
return packs.size() + " packages";
}

}

private CtPackage rootPackage = new CtRootPackage();

public CtModelImpl(Factory f) {
rootPackage.setFactory(f);
}

@Override
public CtPackage getRootPackage() {
return rootPackage;
}


@Override
public Collection<CtType<?>> getAllTypes() {
List<CtType<?>> types = new ArrayList<CtType<?>>();
for (CtPackage pack : getAllPackages()) {
types.addAll(pack.getTypes());
}
return types;
}


@Override
public Collection<CtPackage> getAllPackages() {
return Collections.unmodifiableCollection(rootPackage.getElements(new TypeFilter<CtPackage>(CtPackage.class)));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unify implementation

}


@Override
public void processWith(Processor<?> processor) {
new QueueProcessingManager(rootPackage.getFactory()).process(getRootPackage());
}

@Override
public <E extends CtElement> List<E> getElements(Filter<E> filter) {
return getRootPackage().getElements(filter);
}

}
2 changes: 1 addition & 1 deletion src/main/java/spoon/reflect/declaration/CtPackage.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public interface CtPackage extends CtNamedElement {
String TOP_LEVEL_PACKAGE_NAME = "unnamed package";

/**
* Gets the declaring package of the current one.
* Gets the declaring package of the current one. Returns null if the package is not yet in another one.
*/
CtPackage getDeclaringPackage();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,15 +39,15 @@ public CompilationUnitFactory(Factory factory) {
super(factory);
}

Map<String, CompilationUnit> compilationUnits = new TreeMap<String, CompilationUnit>();
private transient Map<String, CompilationUnit> cachedCompilationUnits = new TreeMap<String, CompilationUnit>();

/**
* Gets the compilation unit map.
*
* @return a map (path -&gt; {@link CompilationUnit})
*/
public Map<String, CompilationUnit> getMap() {
return compilationUnits;
return cachedCompilationUnits;
}

/**
Expand All @@ -62,15 +62,15 @@ public CompilationUnit create() {
* Creates or gets a compilation unit for a given file path.
*/
public CompilationUnit create(String filePath) {
CompilationUnit cu = compilationUnits.get(filePath);
CompilationUnit cu = cachedCompilationUnits.get(filePath);
if (cu == null) {
if ("".equals(filePath)) {
cu = factory.Core().createVirtualCompilationUnit();
return cu;
}
cu = factory.Core().createCompilationUnit();
cu.setFile(new File(filePath));
compilationUnits.put(filePath, cu);
cachedCompilationUnits.put(filePath, cu);
}
return cu;
}
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/spoon/reflect/factory/Factory.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
package spoon.reflect.factory;

import spoon.compiler.Environment;
import spoon.reflect.CtModel;

/**
* Provides the sub-factories required by Spoon.
Expand All @@ -27,6 +28,9 @@
*/
public interface Factory {

/** returns the Spoon model that has been built with this factory or one of its subfactories */
CtModel getModel();

CoreFactory Core(); // used 238 times

TypeFactory Type(); // used 107 times
Expand Down
23 changes: 16 additions & 7 deletions src/main/java/spoon/reflect/factory/FactoryImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,14 @@
*/
package spoon.reflect.factory;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

import spoon.compiler.Environment;
import spoon.reflect.CtModel;
import spoon.reflect.CtModelImpl;
import spoon.reflect.cu.CompilationUnit;
import spoon.reflect.declaration.CtAnnotationType;
import spoon.reflect.declaration.CtClass;
Expand All @@ -32,11 +39,6 @@
import spoon.support.DefaultInternalFactory;
import spoon.support.StandardEnvironment;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

/**
* Implements {@link Factory}
*/
Expand Down Expand Up @@ -214,7 +216,7 @@ public MethodFactory Method() {
return methodF;
}

private PackageFactory packageF;
private transient PackageFactory packageF;

/**
* The {@link CtPackage} sub-factory.
Expand All @@ -227,7 +229,7 @@ public PackageFactory Package() {
return packageF;
}

private CompilationUnitFactory compilationUnit;
private transient CompilationUnitFactory compilationUnit;

/**
* The {@link CompilationUnit} sub-factory.
Expand Down Expand Up @@ -320,4 +322,11 @@ public String dedup(String symbol) {
return symbol;
}
}

private final CtModel model = new CtModelImpl(this);

@Override
public CtModel getModel() {
return model;
}
}
Loading