/******************************************************************************* * Copyright (c) 2005, 2009 committers of openArchitectureWare and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * committers of openArchitectureWare - initial API and implementation *******************************************************************************/ package org.eclipse.xtend.ui.core.internal; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import org.eclipse.core.resources.IStorage; import org.eclipse.internal.xtend.xtend.XtendFile; import org.eclipse.internal.xtend.xtend.ast.Around; import org.eclipse.internal.xtend.xtend.ast.Extension; import org.eclipse.internal.xtend.xtend.ast.ExtensionImportStatement; import org.eclipse.xtend.expression.AnalysationIssue; import org.eclipse.xtend.expression.ExecutionContext; import org.eclipse.xtend.expression.Resource; import org.eclipse.xtend.expression.ResourceManager; import org.eclipse.xtend.shared.ui.core.AbstractResource; import org.eclipse.xtend.shared.ui.core.internal.BuildState; import org.eclipse.xtend.shared.ui.core.internal.ResourceID; import org.eclipse.xtend.ui.core.IXtendResource; import org.eclipse.xtend.ui.core.internal.builder.XtendResourceParser; public class XtendResourceImpl extends AbstractResource implements IXtendResource { private XtendResourceParser parser; public XtendResourceImpl(final XtendFile tpl, final IStorage res, XtendResourceParser parser) { super(res); setExtXptResource(tpl); this.parser = parser; } private XtendFile resource() { return (XtendFile) getExtXptResource(); } @Override public void analyze(final ExecutionContext ctx, final Set<AnalysationIssue> issues) { Set<AnalysationIssue> issuesFromThisResource = new HashSet<AnalysationIssue>(); try { BuildState buildState = BuildState.get(ctx); if (buildState != null) { final ResourceID id = new ResourceID(resource().getFullyQualifiedName(), getFileExtension()); Set<AnalysationIssue> internalIssues = buildState.getIssuesPerResource().get(id); if (internalIssues == null) { internalIssues = new HashSet<AnalysationIssue>(); resource().analyze(ctx, internalIssues); buildState.getIssuesPerResource().put(id, internalIssues); } issuesFromThisResource.addAll(internalIssues); } else { resource().analyze(ctx, issuesFromThisResource); } } catch (Exception e) { // ignore } // remove tons of annoying errors // filter all the 'Error parsing resource' issues that arised from a broken import Set<AnalysationIssue> issuesToRemove = new HashSet<AnalysationIssue>(); for (AnalysationIssue issue : issuesFromThisResource) { if (issue.getType().equals(AnalysationIssue.RESOURCE_NOT_FOUND)) { ExtensionImportStatement importStmt = (ExtensionImportStatement) issue.getElement(); for (AnalysationIssue issue2 : issuesFromThisResource) { if (issue2.getType().equals(AnalysationIssue.INTERNAL_ERROR) && issue2.getMessage().matches("Error parsing extensions.*"+importStmt.getImportedId()+"$")) { issuesToRemove.add(issue2); } } } } issuesFromThisResource.removeAll(issuesToRemove); issues.addAll(issuesFromThisResource); } public List<Extension> getExtensions() { return resource().getExtensions(); } public List<Extension> getPublicExtensions(final ResourceManager rm, ExecutionContext ctx) { return resource().getPublicExtensions(rm, ctx); } public List<Extension> getPublicExtensions(ResourceManager resourceManager, ExecutionContext ctx, Set<String> flowoverCache) { return resource().getPublicExtensions(resourceManager,ctx, flowoverCache); } public String getFileExtension() { return parser.getFileExtension(); } @Override public boolean internalRefresh() { Resource r = parser.parse(getUnderlyingStorage(),getFullyQualifiedName()); if (r==null) { return false; } setExtXptResource(r); return true; } public List<Around> getArounds() { return Collections.emptyList(); // arounds are only used at runtime } @Override public String toString() { return getFullyQualifiedName(); } }