use of org.eclipse.xtext.resource.IContainer in project n4js by eclipse.
the class PolyfillValidatorFragment method holdsSinglePolyfillSource.
/**
* Constraints 129 (Applying Polyfills) No member must be filled by more than one polyfill.
*/
private boolean holdsSinglePolyfillSource(PolyfillValidationState state) {
EList<TMember> myPolyMember = state.polyType.getOwnedMembers();
// a) find references to the filled type
// b) check, that they are in the same Project
// c) search for clashing contributions.
XtextResource res = (XtextResource) state.polyType.eResource();
IResourceDescriptions index = resourceDescriptionsProvider.getResourceDescriptions(res);
// a+b) all polyfills to same calssifier in same project:
IContainer container = containerManager.getContainer(res.getResourceServiceProvider().getResourceDescriptionManager().getResourceDescription(res), index);
// Iterable over all exported Polyfills
Iterable<IEObjectDescription> iterEObj = container.getExportedObjects(TypesPackage.Literals.TCLASSIFIER, N4TSQualifiedNameProvider.getPolyfillFQN(state.filledType, qualifiedNameProvider), false);
// collection of involved TModules for each Member.
ListMultimap<TMember, TModule> clashProviders = LinkedListMultimap.create();
for (IEObjectDescription pivotObjectDescription : iterEObj) {
EObject eob = pivotObjectDescription.getEObjectOrProxy();
// Resolve
if (eob.eIsProxy()) {
eob = EcoreUtil.resolve(eob, res);
}
if (eob == state.polyType) {
// saw myself .-.
continue;
}
EList<TMember> pivotPolyMember = ((TClassifier) eob).getOwnedMembers();
ListMultimap<TMember, TMember> clashing = findClashingMembersByName(myPolyMember, pivotPolyMember);
for (TMember myMember : clashing.keySet()) {
// only interested in the module, so first is sufficient
clashProviders.put(myMember, clashing.get(myMember).get(0).getContainingModule());
}
}
List<TMember> sortedMembers = clashProviders.keySet().stream().sorted().collect(Collectors.toList());
for (TMember myMember : sortedMembers) {
// Combine list of Modules involved in the polyfill clash.
String uris = Stream.concat(Stream.of(myMember.getContainingModule()), clashProviders.get(myMember).stream()).map(u -> u.getQualifiedName().toString()).sorted().reduce("", (a, b) -> a + PREFIX_LIST + b);
if (uris.startsWith(PREFIX_LIST))
uris = uris.substring(PREFIX_LIST.length());
int lastPrefix_idx = uris.lastIndexOf(PREFIX_LIST);
if (lastPrefix_idx >= 0) {
StringBuffer sb = new StringBuffer(uris);
uris = sb.replace(lastPrefix_idx, lastPrefix_idx + PREFIX_LIST.length(), " and ").toString();
}
// give Qualified name filled in Property.
String memberAxis = myMember.getContainingType().getName() + "." + myMember.getName();
// Issue on filled Member-name declaration:
String msg = IssueCodes.getMessageForCLF_POLYFILL_MULTIPOLYFILLS_MEMBER_CONFLICT(uris, memberAxis);
state.host.addIssue(msg, myMember.getAstElement(), N4JSPackage.Literals.PROPERTY_NAME_OWNER__DECLARED_NAME, IssueCodes.CLF_POLYFILL_MULTIPOLYFILLS_MEMBER_CONFLICT);
}
return true;
}
use of org.eclipse.xtext.resource.IContainer in project dsl-devkit by dsldevkit.
the class CachingStateBasedContainerManager method getContainersForHandlesAndResource.
/**
* Returns the containers for the given handles, where one of the containers will also include {@code desc} when appropriate.
*
* @param handles
* handles to get containers for, must not be {@code null}
* @param desc
* description to add, must not be {@code null}
* @param resourceDescriptions
* resource descriptions, must not be {@code null}
* @return list of containers, never {@code null}
*/
protected List<IContainer> getContainersForHandlesAndResource(final List<String> handles, final IResourceDescription desc, final IResourceDescriptions resourceDescriptions) {
List<IContainer> result = getVisibleContainers(handles, resourceDescriptions);
if (!result.isEmpty()) {
URI descURI = desc.getURI();
for (int i = 0; i < result.size(); i++) {
if (result.get(i).getResourceDescription(descURI) != null) {
return result;
}
}
// getEObjectDescriptions(), leading to a stack overflow since it may in turn invoke getVisibleContainers() again.
if (desc instanceof DefaultResourceDescription) {
DefaultResourceDescription d = (DefaultResourceDescription) desc;
if (BuildPhases.isIndexing(d.getResource())) {
return result;
}
}
// the IResourceDescription was found nowhere, add it to the first one that matches the description's domain.
IDomain descDomain = mapper.map(descURI);
IContainer wrappedContainer = null;
int index = 0;
for (int i = 0; i < result.size(); i++) {
IContainer container = result.get(i);
IDomain containerDomain = mapper.map(container);
if (containerDomain != null && containerDomain.equals(descDomain)) {
wrappedContainer = new DescriptionAddingContainer(desc, container);
result.set(index, wrappedContainer);
return result;
}
index++;
}
// If we get here, we found no container with a matching domain. Add to the first, but use a DescriptionAddingContainer that
// will add the description at the end.
wrappedContainer = new DescriptionAtEndAddingContainer(desc, result.get(0));
result.set(0, wrappedContainer);
}
return result;
}
use of org.eclipse.xtext.resource.IContainer in project dsl-devkit by dsldevkit.
the class AbstractPolymorphicScopeProvider method newDataMatchScope.
/**
* Create a new container scope using the results of a given query as its contents.
*
* @param id
* Human-readable name of the scope, typically used to identify where the scope was created. Useful for debugging.
* @param outer
* The outer scope of the new scope.
* @param context
* The context
* @param query
* The query that defines the scope's contents
* @param originalResource
* The original resource
* @param filters
* to apply
* @param nameFunctions
* The name functions to apply
* @param caseInsensitive
* indicates whether the new scope shall be case insensitive
* @return The new scope
*/
protected IScope newDataMatchScope(final String id, final IScope outer, final EObject context, final ContainerQuery query, final Resource originalResource, final Iterable<Predicate<IEObjectDescription>> filters, final Iterable<INameFunction> nameFunctions, final boolean caseInsensitive) {
IScope result = outer;
final List<String> domains = query.getDomains();
for (final IContainer container : Lists.reverse(getVisibleContainers(context, originalResource))) {
if (!domains.isEmpty()) {
final IDomain domain = domainMapper.map(container);
if (domain != null && !domains.contains(domain.getName())) {
// Query not applicable to this container.
continue;
}
}
// Build a branch in the scope chain so that we can filter each container query separately.
IScope contents = new ContainerBasedScope(id, IScope.NULLSCOPE, container, query, nameFunctions, caseInsensitive);
contents = new DataFilteringScope(contents, filters);
result = new BranchingScope(contents, result);
}
return result;
}
use of org.eclipse.xtext.resource.IContainer in project dsl-devkit by dsldevkit.
the class AbstractPolymorphicScopeProvider method newPrefixedContainerScope.
/**
* Create a new prefixed container scope using the results of a given query as its contents.
*
* @param id
* Human-readable name of the scope, typically used to identify where the scope was created. Useful for debugging.
* @param outer
* The outer scope of the new scope.
* @param context
* The context
* @param query
* The query that defines the scope's contents
* @param originalResource
* The original resource
* @param prefix
* prefix to apply for single element lookups
* @param recursive
* whether the qualified name pattern used to search the index should be
* {@link com.avaloq.tools.ddk.xtext.naming.QualifiedNamePattern#RECURSIVE_WILDCARD_SEGMENT recursive}
* @param nameFunctions
* The name functions to apply
* @param caseInsensitive
* indicates whether the new scope shall be case insensitive
* @return The new scope
*/
protected IScope newPrefixedContainerScope(final String id, final IScope outer, final EObject context, final ContainerQuery.Builder query, final Resource originalResource, final String prefix, final boolean recursive, final Iterable<INameFunction> nameFunctions, final boolean caseInsensitive) {
IScope result = outer;
final List<String> domains = query.getDomains();
for (final IContainer container : Lists.reverse(getVisibleContainers(context, originalResource))) {
if (!domains.isEmpty()) {
final IDomain domain = domainMapper.map(container);
if (domain != null && !domains.contains(domain.getName())) {
// Query not applicable to this container.
continue;
}
}
result = new PrefixedContainerBasedScope(id, result, container, query, nameFunctions, QualifiedNames.safeQualifiedName(prefix), recursive, caseInsensitive);
}
return result;
}
use of org.eclipse.xtext.resource.IContainer in project dsl-devkit by dsldevkit.
the class AbstractPolymorphicScopeProvider method newContainerScope.
/**
* Create a new container scope using the results of a given query as its contents.
*
* @param id
* Human-readable name of the scope, typically used to identify where the scope was created. Useful for debugging.
* @param outer
* The outer scope of the new scope.
* @param context
* The context
* @param query
* The query that defines the scope's contents
* @param nameFunctions
* The name functions to apply
* @param originalResource
* The original resource
* @param caseInsensitive
* indicates whether the new scope shall be case insensitive
* @return The new scope
*/
protected IScope newContainerScope(final String id, final IScope outer, final EObject context, final ContainerQuery query, final Resource originalResource, final Iterable<INameFunction> nameFunctions, final boolean caseInsensitive) {
IScope result = outer;
final List<String> domains = query.getDomains();
for (final IContainer container : Lists.reverse(getVisibleContainers(context, originalResource))) {
if (!domains.isEmpty()) {
final IDomain domain = domainMapper.map(container);
if (domain != null && !domains.contains(domain.getName())) {
// Query not applicable to this container.
continue;
}
}
result = new ContainerBasedScope(id, result, container, query, nameFunctions, caseInsensitive);
}
return result;
}
Aggregations