public bool TryResolve(IEnumerable <KeyValuePair <string, string> > values, out IAbsoluteDirectoryPath resolvedDirectoryPath,
                                   out string failureMessage)
            {
                Debug.Assert(values != null);
                IReadOnlyList <string> unresolvedVariables;
                var status = TryResolve(values, out resolvedDirectoryPath, out unresolvedVariables);

                switch (status)
                {
                default:
                    Debug.Assert(status == VariablePathResolvingStatus.Success);
                    failureMessage = null;
                    return(true);

                case VariablePathResolvingStatus.ErrorUnresolvedVariable:
                    Debug.Assert(unresolvedVariables != null);
                    Debug.Assert(unresolvedVariables.Count > 0);
                    failureMessage = VariablePathHelpers.GetUnresolvedVariableFailureReason(unresolvedVariables);
                    return(false);

                case VariablePathResolvingStatus.ErrorVariableResolvedButCannotConvertToAbsolutePath:
                    failureMessage = GetVariableResolvedButCannotConvertToAbsolutePathFailureReason(values, "directory");
                    return(false);
                }
            }
            protected VariablePathBase(string pathString) :
                base(pathString)
            {
                Debug.Assert(pathString != null);
                Debug.Assert(pathString.Length > 0);
                Debug.Assert(pathString.IsNormalized());

                Debug.Assert(m_PathString != null);
                Debug.Assert(m_PathString.Length > 0);
                Debug.Assert(m_PathString.IsNormalized());

                // It is important to use m_PathString and not pathString in IsAVariablePath() !
                // Indeed, since InnerSpecialDir have been resolved, some variable might have disappeared
                // like if pathString was "$(v1)\$(v2)\.." and m_PathString became "$(v1)"
                IReadOnlyList <string> variables;
                string failureReasonUnused;
                var    b = VariablePathHelpers.IsAVariablePath(m_PathString, out variables, out failureReasonUnused);

                Debug.Assert(b);
                Debug.Assert(variables != null);
                Debug.Assert(variables.Count > 0);
                Debug.Assert(variables.All(v => v != null));
                Debug.Assert(variables.All(v => v.Length > 0));
                m_Variables = variables;
            }
            public bool TryResolve(IEnumerable <KeyValuePair <string, string> > variables, out IAbsoluteFilePath resolvedPath, out string failureMessage)
            {
                Argument.IsNotNull(nameof(variables), variables);

                IReadOnlyList <string> unresolvedVariables;

                var variablesList = variables as IList <KeyValuePair <string, string> > ?? variables.ToList();
                var status        = TryResolve(variablesList, out resolvedPath, out unresolvedVariables);

                switch (status)
                {
                default:
                    //Debug.Assert(status == VariablePathResolvingStatus.Success);

                    failureMessage = null;

                    return(true);

                case VariablePathResolvingStatus.UnresolvedVariable:
                    //Debug.Assert(unresolvedVariables != null);
                    //Debug.Assert(unresolvedVariables.Count > 0);

                    failureMessage = VariablePathHelpers.GetUnresolvedVariableFailureReason(unresolvedVariables);

                    return(false);

                case VariablePathResolvingStatus.CannotConvertToAbsolutePath:
                    failureMessage = GetVariableResolvedButCannotConvertToAbsolutePathFailureReason(variablesList, "file");

                    return(false);
                }
            }
Exemple #4
0
            protected VariablePathBase(string path)
                : base(path)
            {
                //Debug.Assert(path.IsNormalized());

                //Debug.Assert(CurrentPath != null);
                //Debug.Assert(CurrentPath.Length > 0);
                //Debug.Assert(CurrentPath.IsNormalized());

                // It is important to use m_PathString and not pathString in IsAVariablePath() !
                // Indeed, since InnerSpecialDir have been resolved, some variable might have disappeared
                // like if pathString was "$(v1)\$(v2)\.." and m_PathString became "$(v1)"
                IReadOnlyList <string> variables;
                string failureMessage;

                VariablePathHelpers.IsAVariablePath(CurrentPath, out variables, out failureMessage);

                //Debug.Assert(b);
                //Debug.Assert(variables != null);
                //Debug.Assert(variables.Count > 0);
                //Debug.Assert(variables.All(v => v != null));
                //Debug.Assert(variables.All(v => v.Length > 0));

                AllVariables = variables;
            }
Exemple #5
0
            protected bool TryResolve(IEnumerable <KeyValuePair <string, string> > values, out string pathStringResolved,
                                      out IReadOnlyList <string> unresolvedVariables)
            {
                Debug.Assert(values != null);

                var pathString = m_PathString;

                var unresolvedVariablesList = new List <string>();
                var nbVariablesToResolve    = AllVariables.Count;

                Debug.Assert(nbVariablesToResolve > 0);
                for (var i = 0; i < nbVariablesToResolve; i++)
                {
                    var variableNameToResolve = AllVariables[i];
                    Debug.Assert(variableNameToResolve != null);
                    Debug.Assert(variableNameToResolve.Length > 0);
                    var resolved = false;
                    foreach (var pair in values)
                    {
                        var pairVariableName = pair.Key;

                        // Support these two cases!
                        if (pairVariableName == null)
                        {
                            continue;
                        }
                        if (pairVariableName.Length == 0)
                        {
                            continue;
                        }                         //
                        if (String.Compare(pairVariableName, variableNameToResolve, true) != 0)
                        {
                            continue;
                        }                         // true for ignore case! variable names are case insensitive
                        resolved = true;
                        var variableValue = pair.Value;
                        if (variableValue == null)
                        {
                            // Treat null variableValue as empty string.
                            variableValue = "";
                        }
                        pathString = VariablePathHelpers.ReplaceVariableWithValue(pathString, variableNameToResolve, variableValue);
                    }
                    if (!resolved)
                    {
                        unresolvedVariablesList.Add(variableNameToResolve);
                    }
                }

                if (unresolvedVariablesList.Count > 0)
                {
                    unresolvedVariables = unresolvedVariablesList.ToReadOnlyWrappedList();
                    pathStringResolved  = null;
                    return(false);
                }

                unresolvedVariables = null;
                pathStringResolved  = pathString;
                return(true);
            }
Exemple #6
0
            protected bool TryResolve(IEnumerable <KeyValuePair <string, string> > variables, out string resolvedPath, out IReadOnlyList <string> unresolvedVariables)
            {
                Argument.IsNotNull(nameof(variables), variables);

                var path = CurrentPath;

                var unresolvedVariablesList = new List <string>();
                var variablesToResolve      = AllVariables.Count;

                //Debug.Assert(nbVariablesToResolve > 0);

                var variablesList = variables as IList <KeyValuePair <string, string> > ?? variables.ToList();

                for (var i = 0; i < variablesToResolve; i++)
                {
                    var variableNameToResolve = AllVariables[i];

                    //Debug.Assert(variableNameToResolve != null);
                    //Debug.Assert(variableNameToResolve.Length > 0);

                    var resolved = false;

                    foreach (var pair in variablesList)
                    {
                        var pairVariableName = pair.Key;

                        // Support these two cases!
                        if (pairVariableName == null)
                        {
                            continue;
                        }

                        if (pairVariableName.Length == 0)
                        {
                            continue;
                        }                         //

                        if (string.Compare(pairVariableName, variableNameToResolve, StringComparison.OrdinalIgnoreCase) != 0)
                        {
                            continue;
                        }                         // true for ignore case! variable names are case insensitive

                        resolved = true;

                        var variableValue = pair.Value ?? string.Empty;

                        path = VariablePathHelpers.ReplaceVariableWithValue(path, variableNameToResolve, variableValue);
                    }

                    if (!resolved)
                    {
                        unresolvedVariablesList.Add(variableNameToResolve);
                    }
                }

                if (unresolvedVariablesList.Count > 0)
                {
                    unresolvedVariables = unresolvedVariablesList.ToReadOnlyWrappedList();
                    resolvedPath        = null;

                    return(false);
                }

                unresolvedVariables = null;
                resolvedPath        = path;

                return(true);
            }