diff --git a/RetailCoder.VBE/UI/Refactorings/Rename/RenamePresenter.cs b/RetailCoder.VBE/UI/Refactorings/Rename/RenamePresenter.cs
index 67796dfd0a..33b41d08c2 100644
--- a/RetailCoder.VBE/UI/Refactorings/Rename/RenamePresenter.cs
+++ b/RetailCoder.VBE/UI/Refactorings/Rename/RenamePresenter.cs
@@ -84,10 +84,19 @@ private string GetReplacementLine(string content, string target, string newName)
{
result = result.Replace(target + '.', newName + '.');
}
+ else if (result.Contains('.' + target))
+ {
+ result = result.Replace('.' + target, '.'+ newName);
+ }
+
if (result.Contains(target + '!'))
{
result = result.Replace(target + '!', newName + '!');
}
+ else if (result.Contains('!' + target))
+ {
+ result = result.Replace('!' + target, '!' + newName);
+ }
return result.Substring(1);
}
diff --git a/Rubberduck.Parsing/QualifiedModuleName.cs b/Rubberduck.Parsing/QualifiedModuleName.cs
index 63ce63daf7..b540d3df52 100644
--- a/Rubberduck.Parsing/QualifiedModuleName.cs
+++ b/Rubberduck.Parsing/QualifiedModuleName.cs
@@ -1,38 +1,40 @@
+using Microsoft.Vbe.Interop;
+
namespace Rubberduck.Parsing
{
public struct QualifiedModuleName
{
- public QualifiedModuleName(string project, string module, int projectHashCode, int contentHashCode)
+ public QualifiedModuleName(string projectName, string module, VBProject project, int contentHashCode)
{
- _projectHash = projectHashCode;
- _contentHashCode = contentHashCode;
_project = project;
+ _contentHashCode = contentHashCode;
+ _projectName = projectName;
_module = module;
}
- public static QualifiedModuleName Empty { get { return new QualifiedModuleName(string.Empty, string.Empty, default(int), default(int)); } }
+ public static QualifiedModuleName Empty { get { return new QualifiedModuleName(string.Empty, string.Empty, null, default(int)); } }
- private readonly int _projectHash;
- public int ProjectHashCode { get { return _projectHash; } }
+ private readonly VBProject _project;
+ public VBProject Project { get { return _project; } }
private readonly int _contentHashCode;
public int ContentHashCode { get { return _contentHashCode; } }
- private readonly string _project;
- public string ProjectName { get { return _project; } }
+ private readonly string _projectName;
+ public string ProjectName { get { return _projectName; } }
private readonly string _module;
public string ModuleName { get { return _module; } }
public override string ToString()
{
- return _project + "." + _module;
+ return _projectName + "." + _module;
}
public override int GetHashCode()
{
- return (_projectHash.ToString() + _contentHashCode.ToString() + ToString()).GetHashCode();
+ return (_project.ToString() + _contentHashCode.ToString() + ToString()).GetHashCode();
}
public override bool Equals(object obj)
diff --git a/Rubberduck.Parsing/Symbols/Declaration.cs b/Rubberduck.Parsing/Symbols/Declaration.cs
index 7654042c30..0a061931fb 100644
--- a/Rubberduck.Parsing/Symbols/Declaration.cs
+++ b/Rubberduck.Parsing/Symbols/Declaration.cs
@@ -1,5 +1,6 @@
using System.Collections.Generic;
using Antlr4.Runtime;
+using Microsoft.Vbe.Interop;
namespace Rubberduck.Parsing.Symbols
{
@@ -52,7 +53,7 @@ public void AddReference(IdentifierReference reference)
///
/// This property is intended to differenciate identically-named VBProjects.
///
- public int ProjectHashCode { get { return _qualifiedName.QualifiedModuleName.ProjectHashCode; } }
+ public VBProject Project { get { return _qualifiedName.QualifiedModuleName.Project; } }
///
/// Gets the name of the VBProject the declaration is made in.
@@ -141,7 +142,7 @@ public override bool Equals(object obj)
public override int GetHashCode()
{
- return string.Concat(ProjectHashCode.ToString(), ProjectName, ComponentName, _parentScope, _identifierName).GetHashCode();
+ return string.Concat(Project.ToString(), ProjectName, ComponentName, _parentScope, _identifierName).GetHashCode();
}
}
}
diff --git a/Rubberduck.Parsing/Symbols/IdentifierReferenceListener.cs b/Rubberduck.Parsing/Symbols/IdentifierReferenceListener.cs
index bb276c183b..d3787a2a70 100644
--- a/Rubberduck.Parsing/Symbols/IdentifierReferenceListener.cs
+++ b/Rubberduck.Parsing/Symbols/IdentifierReferenceListener.cs
@@ -133,8 +133,28 @@ private void EnterIdentifier(RuleContext context, Selection selection)
}
}
+ private static readonly DeclarationType[] ProcedureDeclarations = new[]
+ {
+ DeclarationType.Procedure,
+ DeclarationType.Function,
+ DeclarationType.PropertyGet,
+ DeclarationType.PropertyLet,
+ DeclarationType.PropertySet
+ };
+
private bool IsInScope(Declaration declaration)
{
+ if (ProcedureDeclarations.Contains(declaration.DeclarationType))
+ {
+ if (declaration.Accessibility == Accessibility.Public)
+ {
+ var result = declaration.Project.Equals(_qualifiedName.Project);
+ return result;
+ }
+
+ return declaration.QualifiedName.QualifiedModuleName == _qualifiedName;
+ }
+
return declaration.Scope == _currentScope
|| declaration.Scope == ModuleScope
|| IsGlobalField(declaration)
@@ -176,7 +196,7 @@ private bool IsGlobalField(Declaration declaration)
var modules = moduleMatches.Where(match => match.DeclarationType == DeclarationType.Module);
// Friend members are only visible within the same project.
- var isSameProject = declaration.ProjectHashCode == _qualifiedName.ProjectHashCode;
+ var isSameProject = declaration.Project == _qualifiedName.Project;
// todo: verify that this isn't overkill. Friend modifier has restricted legal usage.
return modules.Any()
@@ -198,7 +218,7 @@ private bool IsGlobalProcedure(Declaration declaration)
}
// Friend members are only visible within the same project.
- var isSameProject = declaration.ProjectHashCode == _qualifiedName.ProjectHashCode;
+ var isSameProject = declaration.Project == _qualifiedName.Project;
// implicit (unspecified) accessibility makes a member Public,
// so if it's in the same project, it's public whenever it's not explicitly Private:
diff --git a/Rubberduck.Parsing/VBComponentExtensions.cs b/Rubberduck.Parsing/VBComponentExtensions.cs
index e1e8d8dfbc..81d616e6a9 100644
--- a/Rubberduck.Parsing/VBComponentExtensions.cs
+++ b/Rubberduck.Parsing/VBComponentExtensions.cs
@@ -13,10 +13,9 @@ public static QualifiedModuleName QualifiedName(this VBComponent component)
{
var moduleName = component.Name;
var project = component.Collection.Parent;
- var hash = project.GetHashCode();
var code = component.CodeModule.Lines().GetHashCode();
- return new QualifiedModuleName(project.Name, moduleName, hash, code);
+ return new QualifiedModuleName(project.Name, moduleName, project, code);
}
public static string Lines(this CodeModule module)