/******************************************************************************* * Copyright (c) 2008, 2013 Borland Software Corporation 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: * Borland Software Corporation - initial API and implementation * Christopher Gerking - Bug 388331 *******************************************************************************/ package org.eclipse.m2m.internal.qvt.oml.editor.ui.completion.collectors; import java.util.ArrayList; import java.util.Collection; import java.util.List; import lpg.runtime.IToken; import lpg.runtime.IPrsStream; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EEnum; import org.eclipse.emf.ecore.EEnumLiteral; import org.eclipse.emf.ecore.EPackage; import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.eclipse.m2m.internal.qvt.oml.ast.env.QvtOperationalEnv; import org.eclipse.m2m.internal.qvt.oml.cst.parser.QVTOParsersym; import org.eclipse.m2m.internal.qvt.oml.editor.ui.completion.CategoryImageConstants; import org.eclipse.m2m.internal.qvt.oml.editor.ui.completion.CompletionProposalUtil; import org.eclipse.m2m.internal.qvt.oml.editor.ui.completion.LightweightParserUtil; import org.eclipse.m2m.internal.qvt.oml.editor.ui.completion.QvtCompletionData; import org.eclipse.m2m.internal.qvt.oml.editor.ui.completion.QvtCompletionProposal; import org.eclipse.m2m.internal.qvt.oml.expressions.ModelType; /** * @author aigdalov */ public class ColonColonCollector extends AbstractCollector { @Override protected boolean isApplicableInternal(QvtCompletionData data) { IToken leftToken = data.getLeftToken(); return leftToken.getKind() == QVTOParsersym.TK_COLONCOLON; } public void addPropoposals(Collection<ICompletionProposal> proposals, QvtCompletionData data) { IToken leftToken = data.getLeftToken(); IPrsStream prsStream = data.getPrsStream(); List<String> pathName = new ArrayList<String>(); IToken pathNameFirstToken = leftToken; for (int i = leftToken.getTokenIndex(); i >= 1; i -= 2) { IToken colonColon = prsStream.getTokenAt(i); if (colonColon.getKind() != QVTOParsersym.TK_COLONCOLON) { break; } IToken name = prsStream.getTokenAt(i - 1); pathNameFirstToken = name; pathName.add(0, name.toString()); } QvtOperationalEnv env = data.getEnvironment(); // Is it a modeltype? if (pathName.size() == 1) { ModelType modelType = env.getModelType(pathName.get(0)); if (modelType != null) { List<EPackage> metamodels = modelType.getMetamodel(); for (EPackage pack : metamodels) { QvtCompletionProposal info = CompletionProposalUtil.createCompletionProposal(pack.getName(), CategoryImageConstants.PACKAGE, data); CompletionProposalUtil.addProposalIfNecessary(proposals, info, data); } for (EPackage pack : metamodels) { CompletionProposalUtil.addPackageContentsProposals(proposals, data, pack); } return; } } // Is it an EPackage? EPackage pack = env.lookupPackage(pathName); if (pack != null) { CompletionProposalUtil.addPackageContentsProposals(proposals, data, pack); return; } // Is it an EEnum? EClassifier classifier = env.lookupClassifier(pathName); if (classifier instanceof EEnum) { EEnum eEnum = (EEnum) classifier; for (EEnumLiteral enumLiteral : eEnum.getELiterals()) { QvtCompletionProposal info = CompletionProposalUtil.createCompletionProposal(enumLiteral.getName(), CategoryImageConstants.ENUM_LITERAL, data); CompletionProposalUtil.addProposalIfNecessary(proposals, info, data); } } if (classifier != null) { IToken prevToken = LightweightParserUtil.getPreviousToken(pathNameFirstToken); if (prevToken != null) { if (QvtCompletionData.isKindOf(prevToken, QVTOParsersym.TK_LPAREN)) { IToken resolveToken = LightweightParserUtil.getPreviousToken(prevToken); if ((resolveToken != null) && (QvtCompletionData.isKindOf(resolveToken, LightweightParserUtil.RESOLVE_FAMILY_TERMINALS))) { CompletionProposalUtil.addAllMappingNamesProposals(proposals, data, classifier, false, true, true); } } if (MappingExtrasMappingNameCollector.isCollectorApplicable(prevToken)) { CompletionProposalUtil.addAllMappingNamesProposals(proposals, data, classifier, false, false, false); } } } } }