/* * Copyright 2015 Nokia Solutions and Networks * Licensed under the Apache License, Version 2.0, * see license.txt file for details. */ package org.rf.ide.core.testdata.model.table.variables.names; import static com.google.common.collect.Lists.newArrayList; import java.util.List; import java.util.Optional; import java.util.Set; import org.rf.ide.core.testdata.model.table.exec.descs.TextPosition; import org.rf.ide.core.testdata.model.table.exec.descs.VariableExtractor; import org.rf.ide.core.testdata.model.table.exec.descs.ast.mapping.MappingResult; import org.rf.ide.core.testdata.model.table.exec.descs.ast.mapping.VariableDeclaration; import org.rf.ide.core.testdata.text.read.recognizer.RobotToken; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; /** * @author mmarzec */ public class VariableNamesSupport { private VariableNamesSupport() { } public static List<String> extractUnifiedVariableNames(final List<VariableDeclaration> assignments) { final List<String> vars = newArrayList(); for (final VariableDeclaration variableDeclaration : assignments) { vars.add(extractUnifiedVariableName(variableDeclaration.asToken().getText())); } return vars; } public static Multimap<String, RobotToken> extractUnifiedVariables(final List<RobotToken> assignments, final VariableExtractor extractor, final String fileName) { final Multimap<String, RobotToken> vars = ArrayListMultimap.create(); for (final RobotToken token : assignments) { final MappingResult mappingResult = extractor.extract(token, fileName); for (final VariableDeclaration variableDeclaration : mappingResult.getCorrectVariables()) { vars.put(extractUnifiedVariableName(variableDeclaration.asToken().getText()), variableDeclaration.asToken()); } } return vars; } public static String extractUnifiedVariableName(final String variable) { return variable != null ? variable.toLowerCase().replaceAll("_", "").replaceAll(" ", "") : ""; } public static String extractUnifiedVariableNameWithoutBrackets(final String variable) { String name = ""; if (variable != null && variable.length() >= 3 && variable.contains("{") && variable.contains("}")) { name = variable.substring(2, variable.length() - 1); } return extractUnifiedVariableName(name); } public static boolean hasEqualNames(final String firstVariable, final String secondVariable) { return extractUnifiedVariableNameWithoutBrackets(firstVariable) .equals(extractUnifiedVariableNameWithoutBrackets(secondVariable)); } public static boolean isDefinedVariable(final VariableDeclaration variableDeclaration, final Set<String> definedVariablesWithUnifiedNames) { return isDefinedVariable(variableDeclaration.getVariableName().getText(), variableDeclaration.getTypeIdentificator().getText(), definedVariablesWithUnifiedNames); } public static boolean isDefinedVariable(final String variableName, final String variableTypeIdentificator, final Set<String> definedVariablesWithUnifiedNames) { final List<String> possibleVariableDefinitions = extractPossibleVariableDefinitions(variableName); for (final String variableDefinition : possibleVariableDefinitions) { if (containsVariable(definedVariablesWithUnifiedNames, variableTypeIdentificator, variableDefinition)) { return true; } } return false; } public static boolean isDefinedVariableInsideComputation(final VariableDeclaration variableDeclaration, final Set<String> definedVariables) { final Optional<TextPosition> variableWithoutComputation = variableDeclaration.getTextWithoutComputation(); if (variableWithoutComputation.isPresent() && (isNumber(variableWithoutComputation.get()) || isDefinedVariable(variableWithoutComputation.get().getText(), variableDeclaration.getTypeIdentificator().getText(), definedVariables))) { return true; } return false; } private static boolean isNumber(final TextPosition pos) { try { final String text = pos.getText(); if (!text.isEmpty()) { Double.parseDouble(text); return true; } } catch (final NumberFormatException nfe) { } return false; } private static List<String> extractPossibleVariableDefinitions(final String variableName) { final List<String> possibleVariableDefinitions = newArrayList(); final String variableDefinition = extractUnifiedVariableName(variableName); final String varDefinitionWithBrackets = createVariableDefinitionWithBrackets(variableDefinition); possibleVariableDefinitions.add(varDefinitionWithBrackets); if (varDefinitionWithBrackets.contains(".")) { possibleVariableDefinitions.add(extractVariableFromDotsRepresentation(varDefinitionWithBrackets)); } return possibleVariableDefinitions; } private static boolean containsVariable(final Set<String> definedVariables, final String varTypeIdentificator, final String varDefinitionWithBrackets) { return definedVariables.contains(varTypeIdentificator + varDefinitionWithBrackets) || (!varTypeIdentificator.equals("@") && definedVariables.contains("@" + varDefinitionWithBrackets)) || (!varTypeIdentificator.equals("&") && definedVariables.contains("&" + varDefinitionWithBrackets)) || (!varTypeIdentificator.equals("$") && definedVariables.contains("$" + varDefinitionWithBrackets)); } private static String extractVariableFromDotsRepresentation(final String varDefinitionWithBrackets) { return varDefinitionWithBrackets.split("\\.")[0] + "}"; } private static String createVariableDefinitionWithBrackets(final String varName) { return "{" + varName + "}"; } }