/* * ****************************************************************************** * MontiCore Language Workbench * Copyright (c) 2015, MontiCore, All rights reserved. * * This project is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3.0 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this project. If not, see <http://www.gnu.org/licenses/>. * ****************************************************************************** */ package de.monticore; import com.google.common.collect.ImmutableList; import de.monticore.ast.ASTNode; import de.monticore.modelloader.ModelingLanguageModelLoader; import de.monticore.symboltable.Symbol; import de.monticore.symboltable.SymbolKind; import de.monticore.symboltable.resolving.ResolvingFilter; import java.util.Collection; import java.util.LinkedHashSet; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Strings.isNullOrEmpty; /** * Base class for modeling languages. Provides access to grammarlanguage-related functionality, * like parsing, symbol table creation, model analysis and code generation. * * @author Pedram Mir Seyed Nazari */ public abstract class CommonModelingLanguage implements ModelingLanguage { private final String fileEnding; private final String name; private final Collection<ResolvingFilter<? extends Symbol>> resolvingFilters = new LinkedHashSet<>(); // TODO PN make it final protected ModelingLanguageModelLoader<? extends ASTNode> modelLoader; // TODO PN make it final private ModelNameCalculator modelNameCalculator; /** * * @param name the name of the modeling grammarlanguage, e.g., "MontiCore Grammar Language" * @param fileEnding the file ending, e.g., ".cd" or "cd" * @param topLevelSymbolKind the {@link SymbolKind} of the top level * {@link de.monticore.symboltable.Symbol} * * @deprecated use {@link #CommonModelingLanguage(String, String)} instead */ @Deprecated public CommonModelingLanguage( final String name, final String fileEnding, final SymbolKind topLevelSymbolKind) { this(name, fileEnding); } /** * @param name the name of the modeling grammarlanguage, e.g., "MontiCore Grammar Language" * @param fileEnding the file ending, e.g., ".cd" or "cd" * {@link de.monticore.symboltable.Symbol} */ public CommonModelingLanguage(final String name, final String fileEnding) { checkArgument(!isNullOrEmpty(name)); checkArgument(!isNullOrEmpty(fileEnding)); this.name = name; this.fileEnding = !fileEnding.startsWith(".") ? fileEnding : fileEnding.substring(1); this.modelLoader = provideModelLoader(); modelNameCalculator = new CommonModelNameCalculator(); } protected abstract ModelingLanguageModelLoader<? extends ASTNode> provideModelLoader(); @Override public String getName() { return name; } @Override public String getFileExtension() { return fileEnding; } @Override public String toString() { return getName(); } @Override public Collection<ResolvingFilter<? extends Symbol>> getResolvers() { return getResolvingFilters(); } @Override public Collection<ResolvingFilter<? extends Symbol>> getResolvingFilters() { return ImmutableList.copyOf(resolvingFilters); } public void addResolvingFilter(final ResolvingFilter<? extends Symbol> resolvingFilter) { resolvingFilters.add(resolvingFilter); } public void addResolvingFilters(final Collection<ResolvingFilter<? extends Symbol>> resolvingFilters) { this.resolvingFilters.addAll(resolvingFilters); } /** * @deprecated use {@link #addResolvingFilter(ResolvingFilter)} instead */ @Deprecated public void addResolver(final ResolvingFilter<? extends Symbol> resolvingFilter) { addResolvingFilter(resolvingFilter); } /** * @deprecated use {@link #addResolvingFilters(Collection)} instead */ public void addResolvers(final Collection<ResolvingFilter<? extends Symbol>> resolvingFilters) { addResolvingFilters(resolvingFilters); } @Override public ModelingLanguageModelLoader<? extends ASTNode> getModelLoader() { return modelLoader; } protected void setModelNameCalculator(ModelNameCalculator modelNameCalculator) { this.modelNameCalculator = modelNameCalculator; } @Override public ModelNameCalculator getModelNameCalculator() { return modelNameCalculator; } }