blob: 7ff669d28976e3008ce1669d69b858acc9a180be [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2020, 2021 Obeo.
* 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:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.acceleo.aql.completion.proposals;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.acceleo.AcceleoPackage;
import org.eclipse.acceleo.Binding;
import org.eclipse.acceleo.BlockComment;
import org.eclipse.acceleo.Comment;
import org.eclipse.acceleo.Documentation;
import org.eclipse.acceleo.Error;
import org.eclipse.acceleo.ExpressionStatement;
import org.eclipse.acceleo.FileStatement;
import org.eclipse.acceleo.ForStatement;
import org.eclipse.acceleo.IfStatement;
import org.eclipse.acceleo.Import;
import org.eclipse.acceleo.LetStatement;
import org.eclipse.acceleo.Module;
import org.eclipse.acceleo.ModuleDocumentation;
import org.eclipse.acceleo.ModuleElement;
import org.eclipse.acceleo.ModuleElementDocumentation;
import org.eclipse.acceleo.ProtectedArea;
import org.eclipse.acceleo.Query;
import org.eclipse.acceleo.Statement;
import org.eclipse.acceleo.Template;
import org.eclipse.acceleo.aql.completion.proposals.syntax.AcceleoSyntacticCompletionProposals;
import org.eclipse.acceleo.aql.completion.proposals.templates.AcceleoCodeTemplateCompletionProposal;
import org.eclipse.acceleo.aql.completion.proposals.templates.AcceleoCodeTemplateCompletionProposalsProvider;
import org.eclipse.acceleo.aql.completion.proposals.templates.AcceleoCodeTemplates;
import org.eclipse.acceleo.util.AcceleoSwitch;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
/**
* Provides both the syntactic and code templates {@link AcceleoCompletionProposal completion proposals} for a
* location where the passed argument is syntactically valid.
*
* @author Florent Latombe
*/
public class AcceleoCompletionProposalsProvider extends AcceleoSwitch<List<AcceleoCompletionProposal>> {
/**
* The {@link AcceleoCodeTemplateCompletionProposalsProvider} that provides code template completion
* proposals.
*/
private final AcceleoCodeTemplateCompletionProposalsProvider acceleoCodeTemplatesProvider = new AcceleoCodeTemplateCompletionProposalsProvider();
/**
* Provides the syntactic and code template completion proposals for a position where the given Acceleo
* type is syntactically allowed.
*
* @param acceleoEClass
* the (non-{@code null}) Acceleo {@link EClass}.
* @return the {@link List} of {@link AcceleoCompletionProposal}.
* @see AcceleoPackage
*/
public List<AcceleoCompletionProposal> getProposalsFor(EClass acceleoEClass) {
return this.doSwitch(acceleoEClass, null);
}
@Override
public List<AcceleoCompletionProposal> defaultCase(EObject object) {
return new ArrayList<>();
}
@Override
public List<AcceleoCompletionProposal> caseComment(Comment object) {
List<AcceleoCompletionProposal> completionProposals = new ArrayList<>();
completionProposals.add(AcceleoSyntacticCompletionProposals.COMMENT_START);
completionProposals.addAll(this.acceleoCodeTemplatesProvider.getProposalsFor(
AcceleoPackage.Literals.COMMENT));
return completionProposals;
}
@Override
public List<AcceleoCompletionProposal> caseBlockComment(BlockComment object) {
List<AcceleoCompletionProposal> completionProposals = new ArrayList<>();
completionProposals.add(AcceleoSyntacticCompletionProposals.BLOCK_COMMENT_START);
completionProposals.addAll(this.acceleoCodeTemplatesProvider.getProposalsFor(
AcceleoPackage.Literals.BLOCK_COMMENT));
return completionProposals;
}
@Override
public List<AcceleoCompletionProposal> caseImport(Import object) {
List<AcceleoCompletionProposal> completionProposals = new ArrayList<>();
completionProposals.add(AcceleoSyntacticCompletionProposals.IMPORT_START);
completionProposals.addAll(this.acceleoCodeTemplatesProvider.getProposalsFor(
AcceleoPackage.Literals.IMPORT));
return completionProposals;
}
@Override
public List<AcceleoCompletionProposal> caseDocumentation(Documentation object) {
List<AcceleoCompletionProposal> completionProposals = new ArrayList<>();
completionProposals.add(AcceleoSyntacticCompletionProposals.DOCUMENTATION_START);
return completionProposals;
}
@Override
public List<AcceleoCompletionProposal> caseModuleDocumentation(ModuleDocumentation object) {
List<AcceleoCompletionProposal> completionProposals = new ArrayList<>();
completionProposals.addAll(this.caseDocumentation(object));
completionProposals.addAll(this.acceleoCodeTemplatesProvider.getProposalsFor(
AcceleoPackage.Literals.MODULE_DOCUMENTATION));
return completionProposals;
}
@Override
public List<AcceleoCompletionProposal> caseModuleElementDocumentation(ModuleElementDocumentation object) {
List<AcceleoCompletionProposal> completionProposals = new ArrayList<>();
completionProposals.addAll(this.caseDocumentation(object));
completionProposals.addAll(this.acceleoCodeTemplatesProvider.getProposalsFor(
AcceleoPackage.Literals.MODULE_ELEMENT_DOCUMENTATION));
return completionProposals;
}
@Override
public List<AcceleoCompletionProposal> caseModule(Module object) {
List<AcceleoCompletionProposal> completionProposals = new ArrayList<>();
completionProposals.add(AcceleoSyntacticCompletionProposals.MODULE_HEADER_START);
completionProposals.addAll(this.acceleoCodeTemplatesProvider.getProposalsFor(
AcceleoPackage.Literals.MODULE));
return completionProposals;
}
@Override
public List<AcceleoCompletionProposal> caseModuleElement(ModuleElement object) {
List<AcceleoCompletionProposal> completionProposals = new ArrayList<>();
completionProposals.addAll(this.caseQuery(null));
completionProposals.addAll(this.caseTemplate(null));
return completionProposals;
}
@Override
public List<AcceleoCompletionProposal> caseQuery(Query object) {
List<AcceleoCompletionProposal> completionProposals = new ArrayList<>();
completionProposals.add(AcceleoSyntacticCompletionProposals.QUERY_START);
completionProposals.addAll(this.acceleoCodeTemplatesProvider.getProposalsFor(
AcceleoPackage.Literals.QUERY));
return completionProposals;
}
@Override
public List<AcceleoCompletionProposal> caseTemplate(Template object) {
List<AcceleoCompletionProposal> completionProposals = new ArrayList<>();
completionProposals.add(AcceleoSyntacticCompletionProposals.TEMPLATE_HEADER_START);
completionProposals.addAll(this.acceleoCodeTemplatesProvider.getProposalsFor(
AcceleoPackage.Literals.TEMPLATE));
return completionProposals;
}
@Override
public List<AcceleoCompletionProposal> caseStatement(Statement object) {
List<AcceleoCompletionProposal> completionProposals = new ArrayList<>();
completionProposals.addAll(this.caseIfStatement(null));
completionProposals.addAll(this.caseForStatement(null));
completionProposals.addAll(this.caseLetStatement(null));
completionProposals.addAll(this.caseExpressionStatement(null));
completionProposals.addAll(this.caseFileStatement(null));
completionProposals.addAll(this.caseProtectedArea(null));
return completionProposals;
}
@Override
public List<AcceleoCompletionProposal> caseFileStatement(FileStatement object) {
List<AcceleoCompletionProposal> completionProposals = new ArrayList<>();
completionProposals.add(AcceleoSyntacticCompletionProposals.STATEMENT_FILE_HEADER_START);
completionProposals.addAll(this.acceleoCodeTemplatesProvider.getProposalsFor(
AcceleoPackage.Literals.FILE_STATEMENT));
return completionProposals;
}
@Override
public List<AcceleoCompletionProposal> caseIfStatement(IfStatement object) {
List<AcceleoCompletionProposal> completionProposals = new ArrayList<>();
completionProposals.add(AcceleoSyntacticCompletionProposals.STATEMENT_IF_HEADER_START);
completionProposals.addAll(this.acceleoCodeTemplatesProvider.getProposalsFor(
AcceleoPackage.Literals.IF_STATEMENT));
return completionProposals;
}
@Override
public List<AcceleoCompletionProposal> caseLetStatement(LetStatement object) {
List<AcceleoCompletionProposal> completionProposals = new ArrayList<>();
completionProposals.add(AcceleoSyntacticCompletionProposals.STATEMENT_LET_HEADER_START);
completionProposals.addAll(this.acceleoCodeTemplatesProvider.getProposalsFor(
AcceleoPackage.Literals.LET_STATEMENT));
return completionProposals;
}
@Override
public List<AcceleoCompletionProposal> caseBinding(Binding object) {
List<AcceleoCompletionProposal> completionProposals = new ArrayList<>();
String sampleVariableName = AcceleoCodeTemplates.DEFAULT_NEW_BINDING_VARIABLE_NAME;
completionProposals.add(new AcceleoCodeTemplateCompletionProposal(sampleVariableName,
sampleVariableName, AcceleoPackage.Literals.BINDING));
completionProposals.addAll(this.acceleoCodeTemplatesProvider.getProposalsFor(
AcceleoPackage.Literals.BINDING));
return completionProposals;
}
@Override
public List<AcceleoCompletionProposal> caseForStatement(ForStatement object) {
List<AcceleoCompletionProposal> completionProposals = new ArrayList<>();
completionProposals.add(AcceleoSyntacticCompletionProposals.STATEMENT_FOR_HEADER_START);
completionProposals.addAll(this.acceleoCodeTemplatesProvider.getProposalsFor(
AcceleoPackage.Literals.FOR_STATEMENT));
return completionProposals;
}
@Override
public List<AcceleoCompletionProposal> caseProtectedArea(ProtectedArea object) {
List<AcceleoCompletionProposal> completionProposals = new ArrayList<>();
completionProposals.add(AcceleoSyntacticCompletionProposals.STATEMENT_PROTECTED_AREA_HEADER_START);
completionProposals.addAll(this.acceleoCodeTemplatesProvider.getProposalsFor(
AcceleoPackage.Literals.PROTECTED_AREA));
return completionProposals;
}
@Override
public List<AcceleoCompletionProposal> caseExpressionStatement(ExpressionStatement object) {
List<AcceleoCompletionProposal> completionProposals = new ArrayList<>();
completionProposals.add(AcceleoSyntacticCompletionProposals.STATEMENT_EXPRESSION_START);
completionProposals.addAll(this.acceleoCodeTemplatesProvider.getProposalsFor(
AcceleoPackage.Literals.EXPRESSION_STATEMENT));
return completionProposals;
}
@Override
public List<AcceleoCompletionProposal> caseError(Error object) {
throw new IllegalArgumentException("This provider must no be used on the Error part of the AST.");
}
}