diff --git a/jps/model-api/src/org/jetbrains/jps/model/library/JpsLibrary.java b/jps/model-api/src/org/jetbrains/jps/model/library/JpsLibrary.java index 677a3b78e61f..da899e595cf9 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/library/JpsLibrary.java +++ b/jps/model-api/src/org/jetbrains/jps/model/library/JpsLibrary.java @@ -1,6 +1,7 @@ package org.jetbrains.jps.model.library; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.model.JpsElement; import org.jetbrains.jps.model.JpsNamedElement; import org.jetbrains.jps.model.JpsReferenceableElement; @@ -32,6 +33,10 @@ public interface JpsLibrary extends JpsNamedElement, JpsReferenceableElement getType(); + @Nullable +

+ JpsTypedLibrary

asTyped(@NotNull JpsLibraryType

type); + @NotNull JpsElement getProperties(); diff --git a/jps/model-api/src/org/jetbrains/jps/model/library/JpsLibraryCollection.java b/jps/model-api/src/org/jetbrains/jps/model/library/JpsLibraryCollection.java index d8e828671cd1..58f82aefb127 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/library/JpsLibraryCollection.java +++ b/jps/model-api/src/org/jetbrains/jps/model/library/JpsLibraryCollection.java @@ -22,6 +22,10 @@ public interface JpsLibraryCollection { @NotNull List getLibraries(); + @NotNull +

+ Iterable> getLibraries(@NotNull JpsLibraryType

type); + void addLibrary(@NotNull JpsLibrary library); @Nullable diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsNamedElementReferenceBase.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsNamedElementReferenceBase.java index e2bd42d1734b..6b70b0c7f86b 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsNamedElementReferenceBase.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsNamedElementReferenceBase.java @@ -12,21 +12,15 @@ import java.util.List; public abstract class JpsNamedElementReferenceBase> extends JpsCompositeElementBase implements JpsElementReference { private static final JpsElementChildRole> PARENT_REFERENCE_ROLE = JpsElementChildRoleBase.create("parent"); - protected final JpsElementCollectionRole myCollectionRole; protected final String myElementName; - protected JpsNamedElementReferenceBase(@NotNull JpsElementCollectionRole role, - @NotNull String elementName, - @NotNull JpsElementReference parentReference) { - super(); - myCollectionRole = role; + protected JpsNamedElementReferenceBase(@NotNull String elementName, @NotNull JpsElementReference parentReference) { myElementName = elementName; myContainer.setChild(PARENT_REFERENCE_ROLE, parentReference); } protected JpsNamedElementReferenceBase(JpsNamedElementReferenceBase original) { super(original); - myCollectionRole = original.myCollectionRole; myElementName = original.myElementName; } @@ -35,7 +29,7 @@ public abstract class JpsNamedElementReferenceBase collection = parent.getContainer().getChild(myCollectionRole); + JpsElementCollectionImpl collection = getCollection(parent); if (collection == null) return null; final List elements = collection.getElements(); @@ -50,10 +44,19 @@ public abstract class JpsNamedElementReferenceBase getCollection(@NotNull JpsCompositeElement parent); + @Nullable protected abstract T resolve(S element); public JpsElementReference getParentReference() { return myContainer.getChild(PARENT_REFERENCE_ROLE); } + + @Override + public JpsElementReference asExternal(@NotNull JpsModel model) { + model.registerExternalReference(this); + return this; + } } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsNamedElementReferenceImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsNamedElementReferenceImpl.java index f4ac0aff9e8a..45ebab4d6129 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsNamedElementReferenceImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsNamedElementReferenceImpl.java @@ -1,6 +1,7 @@ package org.jetbrains.jps.model.impl; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.model.JpsCompositeElement; import org.jetbrains.jps.model.JpsElementReference; import org.jetbrains.jps.model.JpsNamedElement; @@ -9,17 +10,26 @@ import org.jetbrains.jps.model.JpsNamedElement; * @author nik */ public abstract class JpsNamedElementReferenceImpl> extends JpsNamedElementReferenceBase { + protected final JpsElementCollectionRole myCollectionRole; + protected JpsNamedElementReferenceImpl(@NotNull JpsElementCollectionRole role, @NotNull String elementName, @NotNull JpsElementReference parentReference) { - super(role, elementName, parentReference); + super(elementName, parentReference); + myCollectionRole = role; } protected JpsNamedElementReferenceImpl(JpsNamedElementReferenceImpl original) { super(original); + myCollectionRole = original.myCollectionRole; } @Override protected T resolve(T element) { return element; } + + @Nullable + protected JpsElementCollectionImpl getCollection(@NotNull JpsCompositeElement parent) { + return parent.getContainer().getChild(myCollectionRole); + } } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryCollectionImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryCollectionImpl.java index a0e15de8d703..473520fd7c34 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryCollectionImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryCollectionImpl.java @@ -2,8 +2,8 @@ package org.jetbrains.jps.model.library.impl; import org.jetbrains.annotations.NotNull; import org.jetbrains.jps.model.JpsElement; -import org.jetbrains.jps.model.JpsElementCollection; import org.jetbrains.jps.model.JpsElementTypeWithDefaultProperties; +import org.jetbrains.jps.model.impl.JpsElementCollectionImpl; import org.jetbrains.jps.model.library.JpsLibrary; import org.jetbrains.jps.model.library.JpsLibraryCollection; import org.jetbrains.jps.model.library.JpsLibraryType; @@ -15,9 +15,9 @@ import java.util.List; * @author nik */ public class JpsLibraryCollectionImpl implements JpsLibraryCollection { - private final JpsElementCollection myCollection; + private final JpsElementCollectionImpl myCollection; - public JpsLibraryCollectionImpl(JpsElementCollection collection) { + public JpsLibraryCollectionImpl(JpsElementCollectionImpl collection) { myCollection = collection; } @@ -41,6 +41,12 @@ public class JpsLibraryCollectionImpl implements JpsLibraryCollection { return myCollection.getElements(); } + @NotNull + @Override + public

Iterable> getLibraries(@NotNull JpsLibraryType

type) { + return myCollection.getElementsOfType(type); + } + @Override public void addLibrary(@NotNull JpsLibrary library) { myCollection.addChild(library); diff --git a/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryImpl.java index 8522212542f3..80eef83ec80c 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryImpl.java @@ -2,6 +2,7 @@ package org.jetbrains.jps.model.library.impl; import com.intellij.openapi.util.io.FileUtilRt; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.JpsPathUtil; import org.jetbrains.jps.model.*; import org.jetbrains.jps.model.impl.JpsElementCollectionImpl; @@ -37,6 +38,13 @@ public class JpsLibraryImpl

extends JpsNamedCompositeEleme return myLibraryType; } + @Nullable + @Override + public

JpsTypedLibrary

asTyped(@NotNull JpsLibraryType

type) { + //noinspection unchecked + return myLibraryType.equals(type) ? (JpsTypedLibrary

)this : null; + } + @NotNull @Override public P getProperties() { diff --git a/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsSdkReferenceImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsSdkReferenceImpl.java index c688fc1102c0..02b224eca7b1 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsSdkReferenceImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsSdkReferenceImpl.java @@ -1,10 +1,11 @@ package org.jetbrains.jps.model.library.impl; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.model.JpsCompositeElement; import org.jetbrains.jps.model.JpsElement; import org.jetbrains.jps.model.JpsElementReference; -import org.jetbrains.jps.model.JpsModel; +import org.jetbrains.jps.model.impl.JpsElementCollectionImpl; import org.jetbrains.jps.model.impl.JpsNamedElementReferenceBase; import org.jetbrains.jps.model.library.JpsLibrary; import org.jetbrains.jps.model.library.JpsTypedLibrary; @@ -18,10 +19,9 @@ import org.jetbrains.jps.model.library.sdk.JpsSdkType; public class JpsSdkReferenceImpl

extends JpsNamedElementReferenceBase>, JpsSdkReferenceImpl

> implements JpsSdkReference

{ private final JpsSdkType

mySdkType; - public JpsSdkReferenceImpl(@NotNull String elementName, - @NotNull JpsSdkType

sdkType, + public JpsSdkReferenceImpl(@NotNull String elementName, @NotNull JpsSdkType

sdkType, @NotNull JpsElementReference parentReference) { - super(JpsLibraryRole.LIBRARIES_COLLECTION_ROLE, elementName, parentReference); + super(elementName, parentReference); mySdkType = sdkType; } @@ -37,11 +37,7 @@ public class JpsSdkReferenceImpl

extends JpsNamedElementRe @Override protected JpsTypedLibrary> resolve(JpsLibrary element) { - if (element.getType().equals(mySdkType)) { - //noinspection unchecked - return (JpsTypedLibrary>)element; - } - return null; + return element.asTyped(mySdkType); } @NotNull @@ -50,9 +46,8 @@ public class JpsSdkReferenceImpl

extends JpsNamedElementRe return new JpsSdkReferenceImpl

(this); } - @Override - public JpsSdkReferenceImpl

asExternal(@NotNull JpsModel model) { - model.registerExternalReference(this); - return this; + @Nullable + protected JpsElementCollectionImpl getCollection(@NotNull JpsCompositeElement parent) { + return parent.getContainer().getChild(JpsLibraryRole.LIBRARIES_COLLECTION_ROLE); } } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsFacetReferenceImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsFacetReferenceImpl.java index ff9586c49318..015d0085cafd 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsFacetReferenceImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsFacetReferenceImpl.java @@ -1,8 +1,6 @@ package org.jetbrains.jps.model.module.impl; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jps.model.JpsElementReference; -import org.jetbrains.jps.model.JpsModel; import org.jetbrains.jps.model.impl.JpsNamedElementReferenceImpl; import org.jetbrains.jps.model.module.JpsFacet; import org.jetbrains.jps.model.module.JpsFacetReference; @@ -25,10 +23,4 @@ public class JpsFacetReferenceImpl extends JpsNamedElementReferenceImpl asExternal(@NotNull JpsModel model) { - model.registerExternalReference(this); - return this; - } }