| /******************************************************************************* |
| * 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.templates; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import org.eclipse.acceleo.AcceleoPackage; |
| import org.eclipse.acceleo.BlockComment; |
| import org.eclipse.acceleo.Comment; |
| import org.eclipse.acceleo.Documentation; |
| import org.eclipse.acceleo.Error; |
| import org.eclipse.acceleo.Import; |
| import org.eclipse.acceleo.Module; |
| import org.eclipse.acceleo.ModuleDocumentation; |
| import org.eclipse.acceleo.ModuleElementDocumentation; |
| import org.eclipse.acceleo.Query; |
| import org.eclipse.acceleo.Template; |
| import org.eclipse.acceleo.aql.completion.AcceleoAstCompletor; |
| import org.eclipse.acceleo.aql.completion.AcceleoCompletor; |
| import org.eclipse.acceleo.aql.completion.proposals.AcceleoCompletionProposal; |
| import org.eclipse.acceleo.aql.completion.proposals.AcceleoCompletionProposalsProvider; |
| import org.eclipse.acceleo.util.AcceleoSwitch; |
| import org.eclipse.emf.ecore.EClass; |
| import org.eclipse.emf.ecore.EObject; |
| |
| /** |
| * Part of {@link AcceleoCompletionProposalsProvider} in charge of providing code template completion |
| * proposals. The argument passed to this provider represents the Acceleo type(s) syntactically valid at the |
| * completion location. |
| * |
| * @author Florent Latombe |
| * @see AcceleoCodeTemplates |
| * @see AcceleoAstCompletor |
| * @see AcceleoCompletor |
| */ |
| public class AcceleoCodeTemplateCompletionProposalsProvider extends AcceleoSwitch<List<AcceleoCompletionProposal>> { |
| |
| /** |
| * A new line in the description of an {@link AcceleoCompletionProposal}. |
| */ |
| private static final String NEWLINE = AcceleoCompletionProposal.DESCRIPTION_NEWLINE; |
| |
| /** |
| * Opening tag for a code sample in the description of an {@link AcceleoCompletionProposal}. |
| */ |
| private static final String CODE_OPEN = AcceleoCompletionProposal.DESCRIPTION_CODE_OPEN; |
| |
| /** |
| * Closing tag for a code sample in the description of an {@link AcceleoCompletionProposal}. |
| */ |
| private static final String CODE_CLOSE = AcceleoCompletionProposal.DESCRIPTION_CODE_CLOSE; |
| |
| /** |
| * Code template completion proposal for a new {@link Import}. |
| */ |
| public static final AcceleoCodeTemplateCompletionProposal NEW_IMPORT = new AcceleoCodeTemplateCompletionProposal( |
| "New Import", "Inserts the following sample Import:" + NEWLINE + CODE_OPEN |
| + AcceleoCodeTemplates.NEW_IMPORT + CODE_CLOSE, AcceleoCodeTemplates.NEW_IMPORT, |
| AcceleoPackage.Literals.IMPORT); |
| |
| /** |
| * Code template completion proposal for a new {@link ModuleElementDocumentation}. |
| */ |
| public static final AcceleoCodeTemplateCompletionProposal NEW_MODULE_ELEMENT_DOCUMENTATION = new AcceleoCodeTemplateCompletionProposal( |
| "New Module Element Documentation", "Inserts the following sample Module Element Documentation:\n" |
| + AcceleoCodeTemplates.NEW_MODULE_ELEMENT_DOCUMENTATION, |
| AcceleoCodeTemplates.NEW_MODULE_ELEMENT_DOCUMENTATION, |
| AcceleoPackage.Literals.MODULE_ELEMENT_DOCUMENTATION); |
| |
| /** |
| * Code template completion proposal for a new {@link ModuleDocumentation}. |
| */ |
| public static final AcceleoCodeTemplateCompletionProposal NEW_MODULE_DOCUMENTATION = new AcceleoCodeTemplateCompletionProposal( |
| "New Module Documentation", "Inserts the following sample Module Documentation:\n" |
| + AcceleoCodeTemplates.NEW_MODULE_DOCUMENTATION, |
| AcceleoCodeTemplates.NEW_MODULE_DOCUMENTATION, AcceleoPackage.Literals.MODULE_DOCUMENTATION); |
| |
| /** |
| * Code template completion proposal for a new {@link Query}. |
| */ |
| public static final AcceleoCodeTemplateCompletionProposal NEW_QUERY = new AcceleoCodeTemplateCompletionProposal( |
| "New Query", "Inserts the following sample Acceleo Query:" + NEWLINE + CODE_OPEN |
| + AcceleoCodeTemplates.NEW_QUERY + CODE_CLOSE, AcceleoCodeTemplates.NEW_QUERY, |
| AcceleoPackage.Literals.QUERY); |
| |
| /** |
| * Code template completion proposal for a new {@link Template}. |
| */ |
| public static final AcceleoCodeTemplateCompletionProposal NEW_TEMPLATE = new AcceleoCodeTemplateCompletionProposal( |
| "New Template", "Inserts the following sample Acceleo Template:" + NEWLINE + CODE_OPEN |
| + AcceleoCodeTemplates.NEW_TEMPLATE + CODE_CLOSE, AcceleoCodeTemplates.NEW_TEMPLATE, |
| AcceleoPackage.Literals.TEMPLATE); |
| |
| /** |
| * Code template completion proposal for a new {@link Module}. |
| */ |
| public static final AcceleoCodeTemplateCompletionProposal NEW_MODULE = new AcceleoCodeTemplateCompletionProposal( |
| "New Module", "Inserts the following sample Acceleo Module:" + NEWLINE + CODE_OPEN |
| + AcceleoCodeTemplates.NEW_MODULE + CODE_CLOSE, AcceleoCodeTemplates.NEW_MODULE, |
| AcceleoPackage.Literals.MODULE); |
| |
| /** |
| * Code template completion proposal for a new {@link Comment}. |
| */ |
| public static final AcceleoCodeTemplateCompletionProposal NEW_COMMENT = new AcceleoCodeTemplateCompletionProposal( |
| "New Comment", "Inserts the following sample Comment:" + NEWLINE + CODE_OPEN |
| + AcceleoCodeTemplates.NEW_COMMENT + CODE_CLOSE, AcceleoCodeTemplates.NEW_COMMENT, |
| AcceleoPackage.Literals.COMMENT); |
| |
| /** |
| * Code template completion proposal for a new {@link BlockComment}. |
| */ |
| public static final AcceleoCodeTemplateCompletionProposal NEW_BLOCK_COMMENT = new AcceleoCodeTemplateCompletionProposal( |
| "New Block Comment", "Inserts the following sample Block Comment:" + NEWLINE + CODE_OPEN |
| + AcceleoCodeTemplates.NEW_BLOCK_COMMENT + CODE_CLOSE, |
| AcceleoCodeTemplates.NEW_BLOCK_COMMENT, AcceleoPackage.Literals.BLOCK_COMMENT); |
| |
| /** |
| * Code template completion proposal for a new '@main' {@link Comment}. |
| */ |
| public static final AcceleoCodeTemplateCompletionProposal NEW_COMMENT_MAIN = new AcceleoCodeTemplateCompletionProposal( |
| "@Main Annotation Comment", "Inserts the following Comment:" + NEWLINE + CODE_OPEN |
| + AcceleoCodeTemplates.NEW_COMMENT_MAIN + CODE_CLOSE, |
| AcceleoCodeTemplates.NEW_COMMENT_MAIN, AcceleoPackage.Literals.COMMENT); |
| |
| /** |
| * Provides the 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> caseImport(Import object) { |
| List<AcceleoCompletionProposal> completionProposals = new ArrayList<>(); |
| |
| completionProposals.add(NEW_IMPORT); |
| |
| return completionProposals; |
| } |
| |
| @Override |
| public List<AcceleoCompletionProposal> caseQuery(Query object) { |
| List<AcceleoCompletionProposal> completionProposals = new ArrayList<>(); |
| |
| completionProposals.add(NEW_QUERY); |
| |
| return completionProposals; |
| } |
| |
| @Override |
| public List<AcceleoCompletionProposal> caseTemplate(Template object) { |
| List<AcceleoCompletionProposal> completionProposals = new ArrayList<>(); |
| |
| completionProposals.add(NEW_TEMPLATE); |
| |
| return completionProposals; |
| } |
| |
| @Override |
| public List<AcceleoCompletionProposal> caseModule(Module object) { |
| List<AcceleoCompletionProposal> completionProposals = new ArrayList<>(); |
| |
| completionProposals.add(NEW_MODULE); |
| |
| return completionProposals; |
| } |
| |
| @Override |
| public List<AcceleoCompletionProposal> caseComment(Comment object) { |
| List<AcceleoCompletionProposal> completionProposals = new ArrayList<>(); |
| |
| completionProposals.add(NEW_COMMENT); |
| |
| return completionProposals; |
| } |
| |
| @Override |
| public List<AcceleoCompletionProposal> caseBlockComment(BlockComment object) { |
| List<AcceleoCompletionProposal> completionProposals = new ArrayList<>(); |
| |
| completionProposals.add(NEW_BLOCK_COMMENT); |
| |
| return completionProposals; |
| } |
| |
| @Override |
| public List<AcceleoCompletionProposal> caseDocumentation(Documentation object) { |
| List<AcceleoCompletionProposal> completionProposals = new ArrayList<>(); |
| |
| return completionProposals; |
| } |
| |
| @Override |
| public List<AcceleoCompletionProposal> caseModuleDocumentation(ModuleDocumentation object) { |
| List<AcceleoCompletionProposal> completionProposals = new ArrayList<>(); |
| |
| completionProposals.add(NEW_MODULE_DOCUMENTATION); |
| |
| return completionProposals; |
| } |
| |
| @Override |
| public List<AcceleoCompletionProposal> caseModuleElementDocumentation(ModuleElementDocumentation object) { |
| List<AcceleoCompletionProposal> completionProposals = new ArrayList<>(); |
| |
| completionProposals.add(NEW_MODULE_ELEMENT_DOCUMENTATION); |
| |
| 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."); |
| } |
| } |