/* * Copyright 2015 Nokia Solutions and Networks * Licensed under the Apache License, Version 2.0, * see license.txt file for details. */ /* * Copyright 2015 Nokia Solutions and Networks * Licensed under the Apache License, Version 2.0, * see license.txt file for details. */ package org.robotframework.ide.eclipse.main.plugin.project.build.validation; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.Set; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.IPath; import org.rf.ide.core.project.RobotProjectConfig; import org.rf.ide.core.project.RobotProjectConfig.ReferencedLibrary; import org.rf.ide.core.testdata.model.RobotVersion; import org.rf.ide.core.testdata.model.search.keyword.KeywordScope; import org.rf.ide.core.testdata.model.table.keywords.names.QualifiedKeywordName; import org.robotframework.ide.eclipse.main.plugin.model.locators.AccessibleKeywordsEntities; import org.robotframework.ide.eclipse.main.plugin.model.locators.KeywordEntity; import org.robotframework.ide.eclipse.main.plugin.project.library.ArgumentsDescriptor; import org.robotframework.ide.eclipse.main.plugin.project.library.LibrarySpecification; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ListMultimap; public class FileValidationContext extends AccessibleKeywordsEntities { private final ValidationContext context; private final IFile file; private Set<String> accessibleVariables; private final Map<String, ListMultimap<String, KeywordEntity>> alreadyUsedKeywords = new HashMap<>(); private final Map<String, ListMultimap<KeywordScope, KeywordEntity>> possibleKeywords = new HashMap<>(); private ListMultimap<KeywordScope, KeywordEntity> allPossibleKeywords; private Collection<KeywordEntity> hereKeywords; public FileValidationContext(final ValidationContext context, final IFile file) { this(context, file, new ValidationKeywordCollector(file, context), null); } @VisibleForTesting public FileValidationContext(final ValidationContext context, final IFile file, final AccessibleKeywordsCollector accessibleKeywordsCollector, final Set<String> accessibleVariables) { super(file.getFullPath(), accessibleKeywordsCollector); this.context = context; this.file = file; this.accessibleVariables = accessibleVariables; } public IFile getFile() { return file; } public RobotProjectConfig getProjectConfiguration() { return context.getProjectConfiguration(); } public RobotVersion getVersion() { return context.getVersion(); } LibrarySpecification getLibrarySpecifications(final String libName) { return context.getLibrarySpecification(libName); } Map<ReferencedLibrary, LibrarySpecification> getReferencedLibrarySpecifications() { return context.getReferencedLibrarySpecifications(); } Set<String> getAccessibleVariables() { if (accessibleVariables == null) { accessibleVariables = context.collectAccessibleVariables(file); } return accessibleVariables; } public ListMultimap<String, KeywordEntity> findPossibleKeywords(final String keywordName) { ListMultimap<String, KeywordEntity> listMultimap = alreadyUsedKeywords .get(QualifiedKeywordName.unifyDefinition(keywordName)); if (listMultimap == null) { listMultimap = super.findPossibleKeywords(keywordName, true); alreadyUsedKeywords.put(QualifiedKeywordName.unifyDefinition(keywordName), listMultimap); } return listMultimap; } @Override public ListMultimap<KeywordScope, KeywordEntity> getPossibleKeywords( final ListMultimap<String, KeywordEntity> foundKeywords, final String keywordName) { ListMultimap<KeywordScope, KeywordEntity> pos = possibleKeywords .get(QualifiedKeywordName.unifyDefinition(keywordName)); if (pos == null) { pos = super.getPossibleKeywords(foundKeywords, keywordName); possibleKeywords.put(QualifiedKeywordName.unifyDefinition(keywordName), pos); } return pos; } @Override public ListMultimap<KeywordScope, KeywordEntity> getPossibleKeywords() { if (allPossibleKeywords == null) { allPossibleKeywords = super.getPossibleKeywords(); } return allPossibleKeywords; } @Override protected Collection<KeywordEntity> getAccessibleKeywordsDeduplicated() { if (hereKeywords == null) { hereKeywords = super.getAccessibleKeywordsDeduplicated(); } return hereKeywords; } public boolean isValidatingChangedFiles() { return context.isValidatingChangedFiles(); } private static final class ValidationKeywordCollector implements AccessibleKeywordsCollector { private final IFile file; private final ValidationContext context; private ValidationKeywordCollector(final IFile file, final ValidationContext context) { this.file = file; this.context = context; } @Override public Map<String, Collection<KeywordEntity>> collect() { return context.collectAccessibleKeywordNames(file); } } public static final class ValidationKeywordEntity extends KeywordEntity { private final int position; @VisibleForTesting ValidationKeywordEntity(final KeywordScope scope, final String sourceName, final String keywordName, final String alias, final boolean isDeprecated, final IPath exposingFilepath, final int position, final ArgumentsDescriptor argumentsDescriptor) { super(scope, sourceName, keywordName, alias, isDeprecated, argumentsDescriptor, exposingFilepath); this.position = position; } public boolean hasInconsistentName(final String useplaceName) { return !QualifiedKeywordName.isOccurrenceEqualToDefinition(useplaceName, getNameFromDefinition()); } boolean isFromNestedLibrary(final IFile useplaceFile) { final IPath path = useplaceFile.getFullPath(); final KeywordScope scope = getScope(path); return (scope == KeywordScope.REF_LIBRARY || scope == KeywordScope.STD_LIBRARY) && !path.equals(getExposingFilepath()); } @Override public boolean isSameAs(final KeywordEntity other, final IPath useplaceFilepath) { return position == ((ValidationKeywordEntity) other).position && super.isSameAs(other, useplaceFilepath); } @Override public boolean equals(final Object obj) { return super.equals(obj) || position == ((ValidationKeywordEntity) obj).position; } @Override public int hashCode() { return Objects.hash(super.hashCode(), position); } } }