Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added ElementResolver to resolve namespace conflicts in CBN #3255

Merged
merged 43 commits into from Mar 9, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
0166da0
Added ElementResolver to resolve namespace conflicts in CBN
aparajit-pratap Nov 24, 2014
b0ba2e0
changed namespace cache to hold strings
aparajit-pratap Nov 25, 2014
a5096d4
Merge branch 'master' of https://github.com/DynamoDS/Dynamo into name…
aparajit-pratap Nov 26, 2014
43fce8f
updated XML comments in code
aparajit-pratap Nov 26, 2014
78bcfb0
Merge branch 'master' of https://github.com/DynamoDS/Dynamo into name…
aparajit-pratap Dec 16, 2014
d340ab3
addressed review comments
aparajit-pratap Dec 16, 2014
180fc0c
refactored code as per review comments
aparajit-pratap Dec 17, 2014
250772c
Merge branch 'master' of https://github.com/DynamoDS/Dynamo into name…
aparajit-pratap Dec 23, 2014
ea63c9c
Added methods to serialize and deserialize namespace info to DYN file
aparajit-pratap Dec 23, 2014
ed4a1bd
resolved merge conflicts
aparajit-pratap Jan 7, 2015
41af353
added test for serialization and deserialization of namespace informa…
aparajit-pratap Jan 8, 2015
5ac724a
Merge branch 'master' of https://github.com/DynamoDS/Dynamo into name…
aparajit-pratap Jan 19, 2015
33ef0cb
integrated AST traversal and rewrite algorithms from Jun
aparajit-pratap Jan 20, 2015
e3592f0
code fixes for AST mutation of nested IdentifierListNode's
aparajit-pratap Jan 20, 2015
35e9db4
code fix
aparajit-pratap Jan 20, 2015
59739d3
more code fixes
aparajit-pratap Jan 20, 2015
f69a1bd
merged ownership changes to ElementResolver
aparajit-pratap Jan 23, 2015
6d7be80
Merge branch 'addElementResolver' of https://github.com/aparajit-prat…
aparajit-pratap Jan 23, 2015
4ce22ef
Merge branch 'master' of https://github.com/DynamoDS/Dynamo into name…
aparajit-pratap Jan 23, 2015
7548dd3
more changes to handling of element resolver
aparajit-pratap Jan 26, 2015
412785c
removed code
aparajit-pratap Jan 26, 2015
32746f3
Synchronizing workspace and CBN element resolvers
aparajit-pratap Jan 26, 2015
a0a110c
addressed merge conflicts
aparajit-pratap Jan 27, 2015
cadd439
more code changes
aparajit-pratap Jan 27, 2015
3be9f3a
code cleanup
aparajit-pratap Jan 27, 2015
3eb74e5
placeholders for element resolver in Symbol node
aparajit-pratap Jan 27, 2015
f419ef9
added support for element resolver in Symbol node
aparajit-pratap Jan 27, 2015
4e7cbf9
Merge branch 'master' of https://github.com/DynamoDS/Dynamo into name…
aparajit-pratap Jan 29, 2015
590f06e
resolved merge conflicts
aparajit-pratap Feb 8, 2015
eb3d5c2
added test case
aparajit-pratap Feb 9, 2015
ade21bc
Autocomplete now looks up element resolver to list and complete on sh…
aparajit-pratap Feb 10, 2015
6a39642
Merge branch 'master' of https://github.com/DynamoDS/Dynamo into name…
aparajit-pratap Feb 13, 2015
6437742
Merge branch 'master' of https://github.com/DynamoDS/Dynamo into name…
aparajit-pratap Feb 26, 2015
9aa7fc2
addressed merge conflicts, review comments
aparajit-pratap Feb 26, 2015
95cc3b3
resolved merge conflicts
aparajit-pratap Feb 27, 2015
c630f35
minor code fix
aparajit-pratap Mar 3, 2015
9eac0a7
Merge branch 'master' of https://github.com/DynamoDS/Dynamo into name…
aparajit-pratap Mar 3, 2015
7172d44
fixed case where identifier list node does not include a classname
aparajit-pratap Mar 3, 2015
89e6e0a
removed obsolete test
aparajit-pratap Mar 3, 2015
27fea4d
added unit tests
aparajit-pratap Mar 4, 2015
88d4039
resolved merge conflicts
aparajit-pratap Mar 6, 2015
b1cbac2
resolved merge conflicts
aparajit-pratap Mar 9, 2015
741d869
minor code fix
aparajit-pratap Mar 9, 2015
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
5 changes: 2 additions & 3 deletions src/DynamoCore/Core/CustomNodeManager.cs
Expand Up @@ -485,8 +485,7 @@ public bool TryGetInfoFromPath(string path, bool isTestMode, out CustomNodeInfo
nodeFactory,
nodeGraph.Nodes,
nodeGraph.Notes,
workspaceInfo,
nodeGraph.ElementResolver);
workspaceInfo);

RegisterCustomNodeWorkspace(newWorkspace);

Expand Down Expand Up @@ -607,7 +606,7 @@ public WorkspaceModel CreateCustomNode(string name, string category, string desc
ID = newId.ToString(),
FileName = string.Empty
};
var workspace = new CustomNodeWorkspaceModel(info, nodeFactory, new ElementResolver());
var workspace = new CustomNodeWorkspaceModel(info, nodeFactory);

RegisterCustomNodeWorkspace(workspace);
return workspace;
Expand Down
27 changes: 1 addition & 26 deletions src/DynamoCore/Core/NodeGraph.cs
Expand Up @@ -13,8 +13,6 @@ public class NodeGraph
public List<NodeModel> Nodes { get; private set; }
public List<ConnectorModel> Connectors { get; private set; }
public List<NoteModel> Notes { get; private set; }
public ElementResolver ElementResolver { get; private set; }


private NodeGraph() { }

Expand Down Expand Up @@ -118,35 +116,12 @@ private static IEnumerable<NoteModel> LoadNotesFromXml(XmlDocument xmlDoc)
/// <returns></returns>
public static NodeGraph LoadGraphFromXml(XmlDocument xmlDoc, NodeFactory nodeFactory)
{
var elementResolver = LoadElementResolver(xmlDoc);

var nodes = LoadNodesFromXml(xmlDoc, nodeFactory).ToList();
var connectors = LoadConnectorsFromXml(xmlDoc, nodes.ToDictionary(node => node.GUID)).ToList();
var notes = LoadNotesFromXml(xmlDoc).ToList();

return new NodeGraph { Nodes = nodes, Connectors = connectors, Notes = notes, ElementResolver = elementResolver };
return new NodeGraph { Nodes = nodes, Connectors = connectors, Notes = notes };
}

private static ElementResolver LoadElementResolver(XmlDocument xmlDoc)
{
var nodes = xmlDoc.GetElementsByTagName("NamespaceResolutionMap");

var resolutionMap = new Dictionary<string, KeyValuePair<string, string>>();
if (nodes.Count > 0)
{
foreach (XmlNode child in nodes[0].ChildNodes)
{
if (child.Attributes != null)
{
XmlAttribute pName = child.Attributes["partialName"];
XmlAttribute rName = child.Attributes["resolvedName"];
XmlAttribute aName = child.Attributes["assemblyName"];
var kvp = new KeyValuePair<string, string>(rName.Value, aName.Value);
resolutionMap.Add(pName.Value, kvp);
}
}
}
return new ElementResolver(resolutionMap);
}
}
}
45 changes: 35 additions & 10 deletions src/DynamoCore/DSEngine/CodeCompletionServices.cs
Expand Up @@ -4,6 +4,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using ProtoCore.Namespace;

namespace Dynamo.DSEngine.CodeCompletion
{
Expand Down Expand Up @@ -37,10 +38,15 @@ public CodeCompletionServices(ProtoCore.Core core)
/// <param name="code"> code typed in the code block </param>
/// <param name="stringToComplete"> Class name or declared variable </param>
/// <returns> list of method and property members of the type </returns>
internal IEnumerable<CompletionData> GetCompletionsOnType(string code, string stringToComplete)
internal IEnumerable<CompletionData> GetCompletionsOnType(string code, string stringToComplete, ElementResolver resolver = null)
{
IEnumerable<StaticMirror> members = null;

if (resolver != null)
{
stringToComplete = resolver.LookupResolvedName(stringToComplete) ?? stringToComplete;
}

// Determine if the string to be completed is a class
var type = GetClassType(stringToComplete);
if (type != null)
Expand Down Expand Up @@ -88,8 +94,9 @@ internal IEnumerable<string> GetGlobals()
/// </summary>
/// <param name="stringToComplete"> current string being typed which is to be completed </param>
/// <param name="guid"> code block node guid to identify current node being typed </param>
/// <param name="resolver"></param>
/// <returns> list of classes, global methods and properties that match with string being completed </returns>
internal IEnumerable<CompletionData> SearchCompletions(string stringToComplete, Guid guid)
internal IEnumerable<CompletionData> SearchCompletions(string stringToComplete, Guid guid, ElementResolver resolver = null)
{
List<CompletionData> completions = new List<CompletionData>();

Expand All @@ -109,7 +116,7 @@ internal IEnumerable<CompletionData> SearchCompletions(string stringToComplete,
{
completions.AddRange(group.
Where(x => !x.IsHiddenInLibrary).
Select(x =>CompletionData.ConvertMirrorToCompletionData(x, useFullyQualifiedName: true)));
Select(x =>CompletionData.ConvertMirrorToCompletionData(x, useFullyQualifiedName: true, resolver: resolver)));
}
else
completions.AddRange(group.
Expand Down Expand Up @@ -165,7 +172,8 @@ internal IEnumerable<CompletionData> SearchTypes(string stringToComplete)
/// <param name="functionPrefix"> class name in case of constructor or static method, OR
/// declared instance variable on which method is invoked </param>
/// <returns> list of method overload signatures </returns>
internal IEnumerable<CompletionData> GetFunctionSignatures(string code, string functionName, string functionPrefix)
internal IEnumerable<CompletionData> GetFunctionSignatures(string code, string functionName, string functionPrefix,
ElementResolver resolver = null)
{
IEnumerable<MethodMirror> candidates = null;

Expand All @@ -183,6 +191,11 @@ internal IEnumerable<CompletionData> GetFunctionSignatures(string code, string f
}

// Determine if the function prefix is a class name
if (resolver != null)
{
functionPrefix = resolver.LookupResolvedName(functionPrefix) ?? functionPrefix;
}

var type = GetClassType(functionPrefix);
if (type != null)
{
Expand All @@ -191,7 +204,7 @@ internal IEnumerable<CompletionData> GetFunctionSignatures(string code, string f
// If not of class type
else
{
// Check if the function prefix is a declared identifier
// Check if the function prefix is a typed identifier
string typeName = CodeCompletionParser.GetVariableType(code, functionPrefix);
if (typeName != null)
type = GetClassType(typeName);
Expand Down Expand Up @@ -266,9 +279,10 @@ internal CompletionData(string text, CompletionType type)
}


internal static CompletionData ConvertMirrorToCompletionData(StaticMirror mirror, bool useFullyQualifiedName = false)
internal static CompletionData ConvertMirrorToCompletionData(StaticMirror mirror, bool useFullyQualifiedName = false,
ElementResolver resolver = null)
{
MethodMirror method = mirror as MethodMirror;
var method = mirror as MethodMirror;
if (method != null)
{
string methodName = method.MethodName;
Expand All @@ -279,20 +293,31 @@ internal static CompletionData ConvertMirrorToCompletionData(StaticMirror mirror
Stub = signature
};
}
PropertyMirror property = mirror as PropertyMirror;
var property = mirror as PropertyMirror;
if (property != null)
{
string propertyName = property.PropertyName;
return new CompletionData(propertyName, CompletionType.Property);
}
ClassMirror classMirror = mirror as ClassMirror;
var classMirror = mirror as ClassMirror;
if (classMirror != null)
{
string className = useFullyQualifiedName ? classMirror.ClassName : classMirror.Alias;
string className = useFullyQualifiedName ? GetShortClassName(classMirror, resolver) : classMirror.Alias;
return new CompletionData(className, CompletionType.Class);
}
else
throw new ArgumentException("Invalid argument");
}

private static string GetShortClassName(ClassMirror mirror, ElementResolver resolver)
{
var shortName = string.Empty;
if (resolver != null)
{
shortName = resolver.LookupShortName(mirror.ClassName);
}

return string.IsNullOrEmpty(shortName) ? mirror.ClassName : shortName;
}
}
}
2 changes: 2 additions & 0 deletions src/DynamoCore/DSEngine/EngineController.cs
Expand Up @@ -7,6 +7,7 @@
using ProtoCore.AST.AssociativeAST;
using ProtoCore.DSASM.Mirror;
using ProtoCore.Mirror;
using ProtoCore.Namespace;
using ProtoScript.Runners;
using System;
using System.Collections.Generic;
Expand Down Expand Up @@ -623,6 +624,7 @@ private bool HasVariableDefined(string var)
}

#endregion

}

public class CompilationServices
Expand Down
18 changes: 11 additions & 7 deletions src/DynamoCore/Models/CustomNodeWorkspaceModel.cs
Expand Up @@ -33,32 +33,37 @@ private set

public CustomNodeWorkspaceModel(
WorkspaceInfo info,
NodeFactory factory,
ElementResolver elementResolver)
NodeFactory factory)
: this(
factory,
Enumerable.Empty<NodeModel>(),
Enumerable.Empty<NoteModel>(),
info,
elementResolver) { }
info) { }

public CustomNodeWorkspaceModel(
NodeFactory factory,
IEnumerable<NodeModel> e,
IEnumerable<NoteModel> n,
WorkspaceInfo info,
ElementResolver elementResolver)
: base(e, n, info, factory, elementResolver)
ElementResolver elementResolver = null)
: base(e, n, info, factory)
{
HasUnsavedChanges = false;

CustomNodeId = Guid.Parse(info.ID);
Category = info.Category;
Description = info.Description;

if (elementResolver != null)
{
ElementResolver.CopyResolutionMap(elementResolver);
}

PropertyChanged += OnPropertyChanged;
}

#endregion

private void OnPropertyChanged(object sender, PropertyChangedEventArgs args)
{
if (args.PropertyName == "Name")
Expand All @@ -71,7 +76,6 @@ private void OnPropertyChanged(object sender, PropertyChangedEventArgs args)
}
}

#endregion

/// <summary>
/// All CustomNodeDefinitions which this Custom Node depends on.
Expand Down
3 changes: 1 addition & 2 deletions src/DynamoCore/Models/DynamoModel.cs
Expand Up @@ -902,8 +902,7 @@ private bool OpenFile(WorkspaceInfo workspaceInfo, XmlDocument xmlDoc, out Works
nodeGraph.Notes,
workspaceInfo,
DebugSettings.VerboseLogging,
IsTestMode,
nodeGraph.ElementResolver
IsTestMode
);

RegisterHomeWorkspace(newWorkspace);
Expand Down
7 changes: 3 additions & 4 deletions src/DynamoCore/Models/HomeWorkspaceModel.cs
Expand Up @@ -39,7 +39,7 @@ public class HomeWorkspaceModel : WorkspaceModel
Enumerable.Empty<NoteModel>(),
new WorkspaceInfo(){FileName = fileName, Name = "Home"},
verboseLogging,
isTestMode, new ElementResolver()) { }
isTestMode) { }

public HomeWorkspaceModel(
EngineController engine,
Expand All @@ -50,9 +50,8 @@ public class HomeWorkspaceModel : WorkspaceModel
IEnumerable<NoteModel> n,
WorkspaceInfo info,
bool verboseLogging,
bool isTestMode,
ElementResolver elementResolver)
: base(e, n, info, factory, elementResolver)
bool isTestMode)
: base(e, n, info, factory)
{
RunSettings = new RunSettings(info.RunType, info.RunPeriod);

Expand Down
17 changes: 13 additions & 4 deletions src/DynamoCore/Models/WorkspaceModel.cs
Expand Up @@ -423,6 +423,7 @@ public UndoRedoRecorder UndoRecorder
get { return undoRecorder; }
}

public ElementResolver ElementResolver { get; protected set; }
/// <summary>
/// A unique identifier for the workspace.
/// </summary>
Expand All @@ -431,7 +432,6 @@ public Guid Guid
get { return guid; }
}

public ElementResolver ElementResolver { get; private set; }

#endregion

Expand All @@ -441,8 +441,7 @@ public Guid Guid
IEnumerable<NodeModel> e,
IEnumerable<NoteModel> n,
WorkspaceInfo info,
NodeFactory factory,
ElementResolver elementResolver)
NodeFactory factory)
{
guid = Guid.NewGuid();

Expand All @@ -463,11 +462,20 @@ public Guid Guid
undoRecorder = new UndoRedoRecorder(this);

NodeFactory = factory;
ElementResolver = elementResolver;

// Update ElementResolver from nodeGraph.Nodes (where node is CBN)
ElementResolver = new ElementResolver();
foreach (var node in nodes)
{
RegisterNode(node);

var cbn = node as CodeBlockNodeModel;
if (cbn != null && cbn.ElementResolver != null)
{
ElementResolver.CopyResolutionMap(cbn.ElementResolver);
}
}

foreach (var connector in Connectors)
RegisterConnector(connector);
}
Expand Down Expand Up @@ -651,6 +659,7 @@ public virtual bool Save(ProtoCore.Core core)

internal void ResetWorkspace()
{
ElementResolver = new ElementResolver();
ResetWorkspaceCore();
}

Expand Down