mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
new project model: sdk references
This commit is contained in:
@@ -4,6 +4,7 @@ import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.jps.model.library.JpsLibrary;
|
||||
import org.jetbrains.jps.model.library.JpsLibraryReference;
|
||||
import org.jetbrains.jps.model.library.JpsLibraryType;
|
||||
import org.jetbrains.jps.model.library.JpsSdkType;
|
||||
import org.jetbrains.jps.model.module.JpsModule;
|
||||
import org.jetbrains.jps.model.module.JpsModuleReference;
|
||||
import org.jetbrains.jps.model.module.JpsModuleType;
|
||||
@@ -28,6 +29,9 @@ public abstract class JpsElementFactory {
|
||||
public abstract JpsLibraryReference createLibraryReference(@NotNull String libraryName,
|
||||
@NotNull JpsElementReference<? extends JpsCompositeElement> parentReference);
|
||||
|
||||
@NotNull
|
||||
public abstract JpsLibraryReference createSdkReference(@NotNull String sdkName, @NotNull JpsSdkType<?> sdkType);
|
||||
|
||||
@NotNull
|
||||
public abstract JpsElementReference<JpsProject> createProjectReference();
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@ import org.jetbrains.jps.model.library.JpsLibraryCollection;
|
||||
import org.jetbrains.jps.model.library.JpsLibraryType;
|
||||
import org.jetbrains.jps.model.module.JpsModule;
|
||||
import org.jetbrains.jps.model.module.JpsModuleType;
|
||||
import org.jetbrains.jps.model.module.JpsSdkReferencesTable;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -28,4 +29,7 @@ public interface JpsProject extends JpsCompositeElement, JpsReferenceableElement
|
||||
|
||||
@NotNull
|
||||
JpsLibraryCollection getLibraryCollection();
|
||||
|
||||
@NotNull
|
||||
JpsSdkReferencesTable getSdkReferencesTable();
|
||||
}
|
||||
|
||||
@@ -24,4 +24,7 @@ public interface JpsLibrary extends JpsNamedElement, JpsReferenceableElement<Jps
|
||||
|
||||
@NotNull
|
||||
JpsLibraryReference createReference();
|
||||
|
||||
@NotNull
|
||||
JpsLibraryType<?> getType();
|
||||
}
|
||||
|
||||
@@ -5,8 +5,10 @@ import org.jetbrains.jps.model.*;
|
||||
import org.jetbrains.jps.model.library.JpsLibrary;
|
||||
import org.jetbrains.jps.model.library.JpsLibraryReference;
|
||||
import org.jetbrains.jps.model.library.JpsLibraryType;
|
||||
import org.jetbrains.jps.model.library.JpsSdkType;
|
||||
import org.jetbrains.jps.model.library.impl.JpsLibraryImpl;
|
||||
import org.jetbrains.jps.model.library.impl.JpsLibraryReferenceImpl;
|
||||
import org.jetbrains.jps.model.library.impl.JpsSdkReferenceImpl;
|
||||
import org.jetbrains.jps.model.module.JpsModule;
|
||||
import org.jetbrains.jps.model.module.JpsModuleReference;
|
||||
import org.jetbrains.jps.model.module.JpsModuleType;
|
||||
@@ -41,6 +43,12 @@ public class JpsElementFactoryImpl extends JpsElementFactory {
|
||||
return new JpsLibraryReferenceImpl(libraryName, parentReference);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public JpsLibraryReference createSdkReference(@NotNull String sdkName, @NotNull JpsSdkType<?> sdkType) {
|
||||
return new JpsSdkReferenceImpl(sdkName, sdkType, createGlobalReference());
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public JpsElementReference<JpsProject> createProjectReference() {
|
||||
|
||||
@@ -37,13 +37,17 @@ public abstract class JpsNamedElementReferenceBase<T extends JpsNamedElement, Se
|
||||
|
||||
final List<? extends T> elements = parent.getContainer().getChild(myCollectionKind).getElements();
|
||||
for (T element : elements) {
|
||||
if (element.getName().equals(myElementName)) {
|
||||
if (resolvesTo(element)) {
|
||||
return element;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
protected boolean resolvesTo(T element) {
|
||||
return element.getName().equals(myElementName);
|
||||
}
|
||||
|
||||
public JpsElementReference<? extends JpsCompositeElement> getParentReference() {
|
||||
return myContainer.getChild(PARENT_REFERENCE_KIND);
|
||||
}
|
||||
|
||||
@@ -12,8 +12,10 @@ import org.jetbrains.jps.model.library.impl.JpsLibraryCollectionImpl;
|
||||
import org.jetbrains.jps.model.library.impl.JpsLibraryKind;
|
||||
import org.jetbrains.jps.model.module.JpsModule;
|
||||
import org.jetbrains.jps.model.module.JpsModuleType;
|
||||
import org.jetbrains.jps.model.module.JpsSdkReferencesTable;
|
||||
import org.jetbrains.jps.model.module.impl.JpsModuleImpl;
|
||||
import org.jetbrains.jps.model.module.impl.JpsModuleKind;
|
||||
import org.jetbrains.jps.model.module.impl.JpsSdkReferencesTableImpl;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -29,6 +31,7 @@ public class JpsProjectImpl extends JpsRootElementBase<JpsProjectImpl> implement
|
||||
super(model, eventDispatcher);
|
||||
myContainer.setChild(JpsModuleKind.MODULE_COLLECTION_KIND);
|
||||
myContainer.setChild(EXTERNAL_REFERENCES_COLLECTION_KIND);
|
||||
myContainer.setChild(JpsSdkReferencesTableImpl.KIND);
|
||||
myLibraryCollection = new JpsLibraryCollectionImpl(myContainer.setChild(JpsLibraryKind.LIBRARIES_COLLECTION_KIND));
|
||||
}
|
||||
|
||||
@@ -71,6 +74,12 @@ public class JpsProjectImpl extends JpsRootElementBase<JpsProjectImpl> implement
|
||||
return myLibraryCollection;
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public JpsSdkReferencesTable getSdkReferencesTable() {
|
||||
return myContainer.getChild(JpsSdkReferencesTableImpl.KIND);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public JpsElementReference<JpsProject> createReference() {
|
||||
|
||||
@@ -25,6 +25,12 @@ public class JpsLibraryImpl extends JpsNamedCompositeElementBase<JpsLibraryImpl,
|
||||
super(original);
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public JpsLibraryType<?> getType() {
|
||||
return myContainer.getChild(TYPED_DATA_KIND).getType();
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public List<JpsLibraryRoot> getRoots(@NotNull JpsOrderRootType rootType) {
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
package org.jetbrains.jps.model.library.impl;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.jps.model.JpsCompositeElement;
|
||||
import org.jetbrains.jps.model.JpsElementReference;
|
||||
import org.jetbrains.jps.model.JpsModel;
|
||||
import org.jetbrains.jps.model.impl.JpsNamedElementReferenceBase;
|
||||
import org.jetbrains.jps.model.library.JpsLibrary;
|
||||
import org.jetbrains.jps.model.library.JpsLibraryReference;
|
||||
import org.jetbrains.jps.model.library.JpsSdkType;
|
||||
|
||||
/**
|
||||
* @author nik
|
||||
*/
|
||||
public class JpsSdkReferenceImpl extends JpsNamedElementReferenceBase<JpsLibrary, JpsSdkReferenceImpl> implements JpsLibraryReference {
|
||||
@NotNull private final JpsSdkType<?> mySdkType;
|
||||
|
||||
public JpsSdkReferenceImpl(@NotNull String elementName, @NotNull JpsSdkType<?> sdkType, @NotNull JpsElementReference<? extends JpsCompositeElement> parentReference) {
|
||||
super(JpsLibraryKind.LIBRARIES_COLLECTION_KIND, elementName, parentReference);
|
||||
mySdkType = sdkType;
|
||||
}
|
||||
|
||||
public JpsSdkReferenceImpl(JpsSdkReferenceImpl original) {
|
||||
super(original);
|
||||
mySdkType = original.mySdkType;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public String getLibraryName() {
|
||||
return myElementName;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean resolvesTo(JpsLibrary element) {
|
||||
return super.resolvesTo(element) && element.getType().equals(mySdkType);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public JpsSdkReferenceImpl createCopy() {
|
||||
return new JpsSdkReferenceImpl(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public JpsLibraryReference asExternal(@NotNull JpsModel model) {
|
||||
model.registerExternalReference(this);
|
||||
return this;
|
||||
}
|
||||
}
|
||||
@@ -1,10 +1,8 @@
|
||||
package org.jetbrains.jps.model.module.impl;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.jps.model.JpsElementCollection;
|
||||
import org.jetbrains.jps.model.JpsElementKind;
|
||||
import org.jetbrains.jps.model.JpsElementProperties;
|
||||
import org.jetbrains.jps.model.JpsUrlList;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.jps.model.*;
|
||||
import org.jetbrains.jps.model.impl.*;
|
||||
import org.jetbrains.jps.model.library.JpsLibrary;
|
||||
import org.jetbrains.jps.model.library.JpsLibraryCollection;
|
||||
@@ -34,7 +32,7 @@ public class JpsModuleImpl extends JpsNamedCompositeElementBase<JpsModuleImpl, J
|
||||
myContainer.setChild(DEPENDENCIES_LIST_KIND, new JpsDependenciesListImpl());
|
||||
myLibraryCollection = new JpsLibraryCollectionImpl(myContainer.setChild(JpsLibraryKind.LIBRARIES_COLLECTION_KIND));
|
||||
myContainer.setChild(JpsModuleSourceRootKind.ROOT_COLLECTION_KIND);
|
||||
myContainer.setChild(JpsSdkReferencesTableImpl.KIND, new JpsSdkReferencesTableImpl());
|
||||
myContainer.setChild(JpsSdkReferencesTableImpl.KIND);
|
||||
}
|
||||
|
||||
private JpsModuleImpl(JpsModuleImpl original) {
|
||||
@@ -134,4 +132,10 @@ public class JpsModuleImpl extends JpsNamedCompositeElementBase<JpsModuleImpl, J
|
||||
public JpsLibraryCollection getLibraryCollection() {
|
||||
return myLibraryCollection;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public JpsProject getProject() {
|
||||
JpsModel model = getModel();
|
||||
return model != null ? model.getProject() : null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package org.jetbrains.jps.model.module.impl;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.jps.model.JpsProject;
|
||||
import org.jetbrains.jps.model.library.JpsLibrary;
|
||||
import org.jetbrains.jps.model.library.JpsLibraryReference;
|
||||
import org.jetbrains.jps.model.library.JpsSdkType;
|
||||
@@ -44,7 +45,16 @@ public class JpsSdkDependencyImpl extends JpsDependencyElementBase<JpsSdkDepende
|
||||
@Override
|
||||
@Nullable
|
||||
public JpsLibraryReference getSdkReference() {
|
||||
return getDependenciesList().getParent().getSdkReferencesTable().getSdkReference(mySdkType);
|
||||
JpsModuleImpl module = getDependenciesList().getParent();
|
||||
JpsLibraryReference sdkReference = module.getSdkReferencesTable().getSdkReference(mySdkType);
|
||||
if (sdkReference != null) {
|
||||
return sdkReference;
|
||||
}
|
||||
JpsProject project = module.getProject();
|
||||
if (project != null) {
|
||||
return project.getSdkReferencesTable().getSdkReference(mySdkType);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+15
-3
@@ -1,9 +1,9 @@
|
||||
package org.jetbrains.jps.model.module.impl;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.jps.model.JpsElementKind;
|
||||
import org.jetbrains.jps.model.impl.JpsElementKindBase;
|
||||
import org.jetbrains.jps.model.JpsElementCreator;
|
||||
import org.jetbrains.jps.model.impl.JpsCompositeElementBase;
|
||||
import org.jetbrains.jps.model.impl.JpsElementKindBase;
|
||||
import org.jetbrains.jps.model.library.JpsLibraryReference;
|
||||
import org.jetbrains.jps.model.library.JpsSdkType;
|
||||
import org.jetbrains.jps.model.module.JpsSdkReferencesTable;
|
||||
@@ -12,7 +12,7 @@ import org.jetbrains.jps.model.module.JpsSdkReferencesTable;
|
||||
* @author nik
|
||||
*/
|
||||
public class JpsSdkReferencesTableImpl extends JpsCompositeElementBase<JpsSdkReferencesTableImpl> implements JpsSdkReferencesTable {
|
||||
public static final JpsElementKind<JpsSdkReferencesTableImpl> KIND = new JpsElementKindBase<JpsSdkReferencesTableImpl>("sdk references");
|
||||
public static final JpsSdkReferencesTableKind KIND = new JpsSdkReferencesTableKind();
|
||||
|
||||
public JpsSdkReferencesTableImpl() {
|
||||
super();
|
||||
@@ -56,4 +56,16 @@ public class JpsSdkReferencesTableImpl extends JpsCompositeElementBase<JpsSdkRef
|
||||
return obj instanceof JpsSdkReferenceKind && myType.equals(((JpsSdkReferenceKind)obj).myType);
|
||||
}
|
||||
}
|
||||
|
||||
private static class JpsSdkReferencesTableKind extends JpsElementKindBase<JpsSdkReferencesTable> implements JpsElementCreator<JpsSdkReferencesTable> {
|
||||
public JpsSdkReferencesTableKind() {
|
||||
super("sdk references");
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public JpsSdkReferencesTable create() {
|
||||
return new JpsSdkReferencesTableImpl();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+4
-1
@@ -31,7 +31,10 @@ public class JpsLibraryTableLoader {
|
||||
}
|
||||
|
||||
public static JpsLibrary loadLibrary(Element libraryElement) {
|
||||
String name = libraryElement.getAttributeValue("name");
|
||||
return loadLibrary(libraryElement, libraryElement.getAttributeValue("name"));
|
||||
}
|
||||
|
||||
public static JpsLibrary loadLibrary(Element libraryElement, String name) {
|
||||
String typeId = libraryElement.getAttributeValue("type");
|
||||
JpsLibrary library = JpsElementFactory.getInstance().createLibrary(name, getLibraryType(typeId));
|
||||
|
||||
|
||||
+8
-4
@@ -1,5 +1,6 @@
|
||||
package org.jetbrains.jps.model.serialization;
|
||||
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import org.jdom.Element;
|
||||
import org.jetbrains.jps.model.JpsCompositeElement;
|
||||
import org.jetbrains.jps.model.JpsElementFactory;
|
||||
@@ -24,7 +25,7 @@ public class JpsModuleLoader {
|
||||
module.getContentRootsList().addUrl(url);
|
||||
for (Element sourceElement : getChildren(contentElement, "sourceFolder")) {
|
||||
final String sourceUrl = sourceElement.getAttributeValue(URL_ATTRIBUTE);
|
||||
final String packagePrefix = sourceElement.getAttributeValue("packagePrefix");
|
||||
final String packagePrefix = StringUtil.notNullize(sourceElement.getAttributeValue("packagePrefix"));
|
||||
final boolean testSource = Boolean.parseBoolean(sourceElement.getAttributeValue("isTestSource"));
|
||||
final JavaSourceRootType rootType = testSource ? JavaSourceRootType.SOURCE : JavaSourceRootType.TEST_SOURCE;
|
||||
module.addSourceRoot(rootType, sourceUrl, new JavaSourceRootProperties(packagePrefix));
|
||||
@@ -47,8 +48,7 @@ public class JpsModuleLoader {
|
||||
String sdkTypeId = orderEntry.getAttributeValue("jskType");
|
||||
final JpsSdkType<?> sdkType = getSdkType(sdkTypeId);
|
||||
dependenciesList.addSdkDependency(sdkType);
|
||||
module.getSdkReferencesTable()
|
||||
.setSdkReference(sdkType, elementFactory.createLibraryReference(sdkName, elementFactory.createGlobalReference()));
|
||||
module.getSdkReferencesTable().setSdkReference(sdkType, elementFactory.createSdkReference(sdkName, sdkType));
|
||||
}
|
||||
else if ("inheritedJdk".equals(type)) {
|
||||
dependenciesList.addSdkDependency(JpsJavaSdkType.INSTANCE);
|
||||
@@ -62,7 +62,11 @@ public class JpsModuleLoader {
|
||||
}
|
||||
else if ("module-library".equals(type)) {
|
||||
final Element moduleLibraryElement = orderEntry.getChild("library");
|
||||
final JpsLibrary library = JpsLibraryTableLoader.loadLibrary(moduleLibraryElement);
|
||||
String name = moduleLibraryElement.getAttributeValue("name");
|
||||
if (name == null) {
|
||||
name = "#" + (moduleLibraryNum++);
|
||||
}
|
||||
final JpsLibrary library = JpsLibraryTableLoader.loadLibrary(moduleLibraryElement, name);
|
||||
module.addModuleLibrary(library);
|
||||
|
||||
final JpsLibraryDependency dependency = dependenciesList.addLibraryDependency(library);
|
||||
|
||||
+15
@@ -13,6 +13,7 @@ import org.jetbrains.jps.model.JpsGlobal;
|
||||
import org.jetbrains.jps.model.JpsProject;
|
||||
import org.jetbrains.jps.model.java.JpsJavaModuleType;
|
||||
import org.jetbrains.jps.model.library.JpsLibrary;
|
||||
import org.jetbrains.jps.model.library.JpsSdkType;
|
||||
import org.jetbrains.jps.model.module.JpsModule;
|
||||
import org.jetbrains.jps.model.module.JpsModuleType;
|
||||
|
||||
@@ -58,6 +59,7 @@ public class JpsProjectLoader {
|
||||
|
||||
private void loadFromDirectory(File dir) {
|
||||
initMacroMap(dir.getParentFile());
|
||||
loadProjectRoot(loadRootElement(new File(dir, "misc.xml")));
|
||||
loadModules(loadRootElement(new File(dir, "modules.xml")));
|
||||
final File[] libraryFiles = new File(dir, "libraries").listFiles();
|
||||
if (libraryFiles != null) {
|
||||
@@ -72,10 +74,23 @@ public class JpsProjectLoader {
|
||||
private void loadFromIpr(File iprFile) {
|
||||
initMacroMap(iprFile.getParentFile());
|
||||
final Element root = loadRootElement(iprFile);
|
||||
loadProjectRoot(root);
|
||||
loadModules(root);
|
||||
loadProjectLibraries(findComponent(root, "libraryTable"));
|
||||
}
|
||||
|
||||
private void loadProjectRoot(Element root) {
|
||||
Element rootManagerElement = findComponent(root, "ProjectRootManager");
|
||||
if (rootManagerElement != null) {
|
||||
String sdkName = rootManagerElement.getAttributeValue("project-jdk-name");
|
||||
String sdkTypeId = rootManagerElement.getAttributeValue("project-jdk-type");
|
||||
if (sdkName != null && sdkTypeId != null) {
|
||||
JpsSdkType<?> sdkType = JpsModuleLoader.getSdkType(sdkTypeId);
|
||||
myProject.getSdkReferencesTable().setSdkReference(sdkType, JpsElementFactory.getInstance().createSdkReference(sdkName, sdkType));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void initMacroMap(File projectBaseDir) {
|
||||
myMacroToPathMap = new ExpandMacroToPathMap();
|
||||
myMacroToPathMap.addMacroExpand("PROJECT_DIR", FileUtil.toSystemIndependentName(projectBaseDir.getAbsolutePath()));
|
||||
|
||||
+12
-1
@@ -2,10 +2,12 @@ package org.jetbrains.jps.model.serialization;
|
||||
|
||||
import com.intellij.openapi.application.PathManager;
|
||||
import org.jetbrains.jps.model.JpsModelTestCase;
|
||||
import org.jetbrains.jps.model.java.JpsJavaSdkType;
|
||||
import org.jetbrains.jps.model.library.JpsLibrary;
|
||||
import org.jetbrains.jps.model.module.JpsModule;
|
||||
import org.jetbrains.jps.model.module.*;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author nik
|
||||
@@ -15,8 +17,17 @@ public class JpsModuleSerializationTest extends JpsModelTestCase {
|
||||
loadProject("iprProject/iprProject.ipr");
|
||||
final JpsModule module = assertOneElement(myModel.getProject().getModules());
|
||||
assertEquals("iprProject", module.getName());
|
||||
|
||||
final JpsLibrary library = assertOneElement(myModel.getProject().getLibraryCollection().getLibraries());
|
||||
assertEquals("junit", library.getName());
|
||||
|
||||
List<JpsDependencyElement> dependencies = module.getDependenciesList().getDependencies();
|
||||
JpsSdkDependency sdkDependency = assertInstanceOf(dependencies.get(0), JpsSdkDependency.class);
|
||||
assertSame(JpsJavaSdkType.INSTANCE, sdkDependency.getSdkType());
|
||||
assertEquals("1.6", sdkDependency.getSdkReference().getLibraryName());
|
||||
assertInstanceOf(dependencies.get(1), JpsModuleSourceDependency.class);
|
||||
assertInstanceOf(dependencies.get(2), JpsLibraryDependency.class);
|
||||
assertInstanceOf(dependencies.get(3), JpsLibraryDependency.class);
|
||||
}
|
||||
|
||||
private void loadProject(final String path) {
|
||||
|
||||
Reference in New Issue
Block a user