Skip to content

Commit

Permalink
Merge pull request #4845 from comintern/document
Browse files Browse the repository at this point in the history
Split Documents into subclass of ClassModuleDeclaration
  • Loading branch information
retailcoder committed Mar 14, 2019
2 parents fb6800d + a23f1b3 commit 189aa1c
Show file tree
Hide file tree
Showing 29 changed files with 127 additions and 73 deletions.
Expand Up @@ -85,6 +85,7 @@ public sealed class HungarianNotationInspection : InspectionBase
DeclarationType.Constant,
DeclarationType.Control,
DeclarationType.ClassModule,
DeclarationType.Document,
DeclarationType.Member,
DeclarationType.Module,
DeclarationType.ProceduralModule,
Expand Down
Expand Up @@ -20,7 +20,7 @@ protected override IEnumerable<IInspectionResult> DoGetInspectionResults()
.Where(declaration =>
{
if (declaration.IsWithEvents
|| !new[] {DeclarationType.ClassModule, DeclarationType.ProceduralModule}.Contains(declaration.ParentDeclaration.DeclarationType)
|| !new[] {DeclarationType.ClassModule, DeclarationType.Document, DeclarationType.ProceduralModule}.Contains(declaration.ParentDeclaration.DeclarationType)
|| IsIgnoringInspectionResultFor(declaration, AnnotationName))
{
return false;
Expand Down
Expand Up @@ -70,7 +70,7 @@ private bool CanBeChangedToBePassedByValIndividually(ParameterDeclaration parame
&& (parameter.IsByRef || parameter.IsImplicitByRef)
&& !IsParameterOfDeclaredLibraryFunction(parameter)
&& (parameter.AsTypeDeclaration == null
|| (parameter.AsTypeDeclaration.DeclarationType != DeclarationType.ClassModule
|| (!parameter.AsTypeDeclaration.DeclarationType.HasFlag(DeclarationType.ClassModule)
&& parameter.AsTypeDeclaration.DeclarationType != DeclarationType.UserDefinedType
&& parameter.AsTypeDeclaration.DeclarationType != DeclarationType.Enumeration))
&& !parameter.References.Any(reference => reference.IsAssignment)
Expand Down
Expand Up @@ -29,8 +29,10 @@ protected override IEnumerable<IInspectionResult> DoGetInspectionResults()
{
var declarations = UserDeclarations.ToList();

var classes = State.DeclarationFinder.UserDeclarations(DeclarationType.ClassModule).ToList(); // declarations.Where(item => item.DeclarationType == DeclarationType.ClassModule).ToList();
var modules = State.DeclarationFinder.UserDeclarations(DeclarationType.ProceduralModule).ToList(); // declarations.Where(item => item.DeclarationType == DeclarationType.ProceduralModule).ToList();
var classes = State.DeclarationFinder.UserDeclarations(DeclarationType.ClassModule)
.Concat(State.DeclarationFinder.UserDeclarations(DeclarationType.Document))
.ToList();
var modules = State.DeclarationFinder.UserDeclarations(DeclarationType.ProceduralModule).ToList();

var handlers = State.DeclarationFinder.UserDeclarations(DeclarationType.Control)
.SelectMany(control => declarations.FindEventHandlers(control)).ToList();
Expand Down
Expand Up @@ -119,8 +119,8 @@ private static bool DeclarationInReferencedProjectCanBeShadowed(Declaration orig
return false;
}

var originalDeclarationComponentType = originalDeclaration.QualifiedName.QualifiedModuleName.ComponentType;
var userDeclarationComponentType = userDeclaration.QualifiedName.QualifiedModuleName.ComponentType;
var originalDeclarationEnclosingType = originalDeclaration.QualifiedName.QualifiedModuleName.ComponentType;
var userDeclarationEnclosingType = userDeclaration.QualifiedName.QualifiedModuleName.ComponentType;

// It is not possible to directly access a Parameter, UDT Member or Label declared in another project
if (originalDeclaration.DeclarationType == DeclarationType.Parameter || originalDeclaration.DeclarationType == DeclarationType.UserDefinedTypeMember ||
Expand All @@ -136,20 +136,20 @@ private static bool DeclarationInReferencedProjectCanBeShadowed(Declaration orig
}

// It is not possible to directly access a UserForm or Document declared in another project, nor any declarations placed inside them
if (originalDeclarationComponentType == ComponentType.UserForm || originalDeclarationComponentType == ComponentType.Document)
if (originalDeclarationEnclosingType == ComponentType.UserForm || originalDeclarationEnclosingType == ComponentType.Document)
{
return false;
}

// It is not possible to directly access any declarations placed inside a Class Module
if (originalDeclaration.DeclarationType != DeclarationType.ClassModule && originalDeclarationComponentType == ComponentType.ClassModule)
if (originalDeclaration.DeclarationType != DeclarationType.ClassModule && originalDeclarationEnclosingType == ComponentType.ClassModule)
{
return false;
}

if (userDeclaration.DeclarationType == DeclarationType.ClassModule)
if (userDeclaration.DeclarationType == DeclarationType.ClassModule || userDeclaration.DeclarationType == DeclarationType.Document)
{
switch (userDeclarationComponentType)
switch (userDeclarationEnclosingType)
{
case ComponentType.UserForm when !ReferencedProjectTypeShadowingRelations[originalDeclaration.DeclarationType].Contains(DeclarationType.UserForm):
return false;
Expand All @@ -158,8 +158,8 @@ private static bool DeclarationInReferencedProjectCanBeShadowed(Declaration orig
}
}

if (userDeclaration.DeclarationType != DeclarationType.ClassModule ||
(userDeclarationComponentType != ComponentType.UserForm && userDeclarationComponentType != ComponentType.Document))
if ((userDeclaration.DeclarationType != DeclarationType.ClassModule && userDeclaration.DeclarationType != DeclarationType.Document) ||
(userDeclarationEnclosingType != ComponentType.UserForm && userDeclarationEnclosingType != ComponentType.Document))
{
if (!ReferencedProjectTypeShadowingRelations[originalDeclaration.DeclarationType].Contains(userDeclaration.DeclarationType))
{
Expand Down Expand Up @@ -188,7 +188,7 @@ private static bool DeclarationInAnotherComponentCanBeShadowed(Declaration origi
return false;
}

var originalDeclarationComponentType = originalDeclaration.QualifiedName.QualifiedModuleName.ComponentType;
var originalDeclarationEnclosingType = originalDeclaration.QualifiedName.QualifiedModuleName.ComponentType;

// It is not possible to directly access a Parameter, UDT Member or Label declared in another component.
if (originalDeclaration.DeclarationType == DeclarationType.Parameter || originalDeclaration.DeclarationType == DeclarationType.UserDefinedTypeMember ||
Expand All @@ -198,27 +198,33 @@ private static bool DeclarationInAnotherComponentCanBeShadowed(Declaration origi
}

// It is not possible to directly access any declarations placed inside a Class Module.
if (originalDeclaration.DeclarationType != DeclarationType.ClassModule && originalDeclarationComponentType == ComponentType.ClassModule)
if (originalDeclaration.DeclarationType != DeclarationType.ClassModule &&
originalDeclaration.DeclarationType != DeclarationType.Document &&
originalDeclarationEnclosingType == ComponentType.ClassModule)
{
return false;
}

// It is not possible to directly access any declarations placed inside a Document Module. (Document Modules have DeclarationType ClassMoodule.)
if (originalDeclaration.DeclarationType != DeclarationType.ClassModule && originalDeclarationComponentType == ComponentType.Document)
if (originalDeclaration.DeclarationType != DeclarationType.ClassModule &&
originalDeclaration.DeclarationType != DeclarationType.Document &&
originalDeclarationEnclosingType == ComponentType.Document)
{
return false;
}

// It is not possible to directly access any declarations placed inside a User Form. (User Forms have DeclarationType ClassMoodule.)
if (originalDeclaration.DeclarationType != DeclarationType.ClassModule && originalDeclarationComponentType == ComponentType.UserForm)
if (originalDeclaration.DeclarationType != DeclarationType.ClassModule &&
originalDeclaration.DeclarationType != DeclarationType.Document &&
originalDeclarationEnclosingType == ComponentType.UserForm)
{
return false;
}

if (originalDeclaration.DeclarationType == DeclarationType.ClassModule)
if (originalDeclaration.DeclarationType == DeclarationType.ClassModule || originalDeclaration.DeclarationType == DeclarationType.Document)
{
// Syntax of instantiating a new class makes it impossible to be shadowed
switch (originalDeclarationComponentType)
switch (originalDeclarationEnclosingType)
{
case ComponentType.ClassModule:
return false;
Expand Down Expand Up @@ -250,8 +256,12 @@ private static bool DeclarationInAnotherComponentCanBeShadowed(Declaration origi
private static bool DeclarationInTheSameComponentCanBeShadowed(Declaration originalDeclaration, Declaration userDeclaration)
{
// Shadowing the component containing the declaration is not a problem, because it is possible to directly access declarations inside that component
if (originalDeclaration.DeclarationType == DeclarationType.ProceduralModule || originalDeclaration.DeclarationType == DeclarationType.ClassModule ||
userDeclaration.DeclarationType == DeclarationType.ProceduralModule || userDeclaration.DeclarationType == DeclarationType.ClassModule)
if (originalDeclaration.DeclarationType == DeclarationType.ProceduralModule ||
originalDeclaration.DeclarationType == DeclarationType.ClassModule ||
originalDeclaration.DeclarationType == DeclarationType.Document ||
userDeclaration.DeclarationType == DeclarationType.ProceduralModule ||
userDeclaration.DeclarationType == DeclarationType.ClassModule ||
userDeclaration.DeclarationType == DeclarationType.Document)
{
return false;
}
Expand Down Expand Up @@ -360,7 +370,7 @@ private static bool DeclarationIsLocal(Declaration declaration)
}.ToHashSet(),
[DeclarationType.ClassModule] = new[]
{
DeclarationType.Project, DeclarationType.ProceduralModule, DeclarationType.ClassModule, DeclarationType.UserForm
DeclarationType.Project, DeclarationType.ProceduralModule, DeclarationType.ClassModule, DeclarationType.UserForm, DeclarationType.Document
}.ToHashSet(),
[DeclarationType.Procedure] = new[]
{
Expand Down
Expand Up @@ -19,7 +19,7 @@ protected override IEnumerable<IInspectionResult> DoGetInspectionResults()
var eventHandlers = State.DeclarationFinder.FindEventHandlers().ToList();

var names = State.DeclarationFinder.UserDeclarations(Parsing.Symbols.DeclarationType.Member)
.Where(w => w.ParentDeclaration.DeclarationType == Parsing.Symbols.DeclarationType.ClassModule)
.Where(w => w.ParentDeclaration.DeclarationType.HasFlag(Parsing.Symbols.DeclarationType.ClassModule))
.Where(w => !interfaceMembers.Contains(w) && !eventHandlers.Contains(w))
.Where(w => w.Accessibility == Parsing.Symbols.Accessibility.Public || w.Accessibility == Parsing.Symbols.Accessibility.Implicit)
.Where(w => w.IdentifierName.Contains('_'))
Expand Down
Expand Up @@ -107,6 +107,7 @@ private string UninitializedComparisonForParameter(ParameterDeclaration paramete
switch (parameter.AsTypeDeclaration.DeclarationType)
{
case DeclarationType.ClassModule:
case DeclarationType.Document:
return $"{parameter.IdentifierName} Is {Tokens.Nothing}";
case DeclarationType.Enumeration:
var members = _declarationFinderProvider.DeclarationFinder.AllDeclarations.OfType<ValuedDeclaration>()
Expand Down
Expand Up @@ -48,9 +48,9 @@ protected override bool EvaluateCanExecute(object parameter)
// ReSharper disable once SwitchStatementMissingSomeCases
switch (declaration.DeclarationType)
{
case DeclarationType.ClassModule when qualifiedModuleName.ComponentType != ComponentType.Document:
return _projectsProvider.Component(qualifiedModuleName).HasDesigner;
case DeclarationType.ClassModule:
return _projectsProvider.Component(qualifiedModuleName).HasDesigner;
case DeclarationType.Document:
using (var app = _vbe.HostApplication())
{
return app?.CanOpenDocumentDesigner(qualifiedModuleName) ?? false;
Expand All @@ -71,7 +71,7 @@ protected override void OnExecute(object parameter)
if (!base.EvaluateCanExecute(parameter) ||
!(parameter is CodeExplorerItemViewModel node) ||
node.Declaration == null ||
node.Declaration.DeclarationType != DeclarationType.ClassModule)
!node.Declaration.DeclarationType.HasFlag(DeclarationType.ClassModule))
{
return;
}
Expand Down
Expand Up @@ -32,8 +32,9 @@ public RefactorExtractInterfaceCommand(RubberduckParserState state, IMessageBox
private static readonly IReadOnlyList<DeclarationType> ModuleTypes = new[]
{
DeclarationType.ClassModule,
DeclarationType.Document,
DeclarationType.UserForm,
DeclarationType.ProceduralModule,
DeclarationType.ProceduralModule
};

protected override bool EvaluateCanExecute(object parameter)
Expand Down
8 changes: 2 additions & 6 deletions Rubberduck.Parsing/Binding/Bindings/IndexDefaultBinding.cs
Expand Up @@ -201,13 +201,9 @@ private IBoundExpression ResolveDefaultMember(IBoundExpression lExpression, stri
The declared type of <l-expression> is a specific class, which has a public default Property
Get, Property Let, function or subroutine, and one of the following is true:
*/
bool hasDefaultMember = asTypeDeclaration != null
&& asTypeDeclaration.DeclarationType == DeclarationType.ClassModule
&& ((ClassModuleDeclaration)asTypeDeclaration).DefaultMember != null;
if (hasDefaultMember)
if (asTypeDeclaration is ClassModuleDeclaration classModule
&& classModule.DefaultMember is Declaration defaultMember)
{
ClassModuleDeclaration classModule = (ClassModuleDeclaration)asTypeDeclaration;
Declaration defaultMember = classModule.DefaultMember;
bool isPropertyGetLetFunctionProcedure =
defaultMember.DeclarationType == DeclarationType.PropertyGet
|| defaultMember.DeclarationType == DeclarationType.PropertyLet
Expand Down
Expand Up @@ -144,7 +144,7 @@ private IBoundExpression ResolveLExpressionIsVariablePropertyOrFunction()
{
return null;
}
if (referencedType.DeclarationType != DeclarationType.UserDefinedType && referencedType.DeclarationType != DeclarationType.ClassModule)
if (referencedType.DeclarationType != DeclarationType.UserDefinedType && !referencedType.DeclarationType.HasFlag(DeclarationType.ClassModule))
{
return null;
}
Expand Down Expand Up @@ -378,7 +378,7 @@ the member.
- The member is a value. In this case, the member access expression is classified as a value with
the same declared type as the member.
*/
bool isDefaultInstanceVariableClass = _lExpression.Classification == ExpressionClassification.Type && _lExpression.ReferencedDeclaration.DeclarationType == DeclarationType.ClassModule && ((ClassModuleDeclaration)_lExpression.ReferencedDeclaration).HasDefaultInstanceVariable;
bool isDefaultInstanceVariableClass = _lExpression.Classification == ExpressionClassification.Type && _lExpression.ReferencedDeclaration is ClassModuleDeclaration classModule && classModule.HasDefaultInstanceVariable;
if (_lExpression.Classification != ExpressionClassification.ProceduralModule && !isDefaultInstanceVariableClass)
{
return null;
Expand Down
Expand Up @@ -160,7 +160,7 @@ private IBoundExpression ResolveClassModule(bool lExpressionIsEnclosingProject,
*/
if (lExpressionIsEnclosingProject)
{
if (_module.DeclarationType == DeclarationType.ClassModule && _declarationFinder.IsMatch(_module.IdentifierName, name))
if (_module.DeclarationType.HasFlag(DeclarationType.ClassModule) && _declarationFinder.IsMatch(_module.IdentifierName, name))
{
return new MemberAccessExpression(_module, ExpressionClassification.Type, _expression, _unrestrictedNameContext, lExpression);
}
Expand Down
Expand Up @@ -154,7 +154,7 @@ private IBoundExpression ResolveEnclosingProject(string name)
{
return new SimpleNameExpression(proceduralModuleEnclosingProject, ExpressionClassification.ProceduralModule, _expression);
}
if (_module.DeclarationType == DeclarationType.ClassModule && _declarationFinder.IsMatch(_module.IdentifierName, name))
if (_module is ClassModuleDeclaration && _declarationFinder.IsMatch(_module.IdentifierName, name))
{
return new SimpleNameExpression(_module, ExpressionClassification.Type, _expression);
}
Expand Down
7 changes: 4 additions & 3 deletions Rubberduck.Parsing/Symbols/ClassModuleDeclaration.cs
Expand Up @@ -9,7 +9,7 @@

namespace Rubberduck.Parsing.Symbols
{
public sealed class ClassModuleDeclaration : ModuleDeclaration
public class ClassModuleDeclaration : ModuleDeclaration
{
private readonly List<string> _supertypeNames;
private readonly HashSet<Declaration> _supertypes;
Expand All @@ -28,12 +28,13 @@ public sealed class ClassModuleDeclaration : ModuleDeclaration
Attributes attributes,
bool isWithEvents = false,
bool hasDefaultInstanceVariable = false,
bool isControl = false)
bool isControl = false,
bool isDocument = false)
: base(
qualifiedName,
projectDeclaration,
name,
DeclarationType.ClassModule,
isDocument ? DeclarationType.Document : DeclarationType.ClassModule,
isUserDefined,
annotations,
attributes,
Expand Down
3 changes: 2 additions & 1 deletion Rubberduck.Parsing/Symbols/Declaration.cs
Expand Up @@ -235,7 +235,7 @@ public static Declaration GetModuleParent(Declaration declaration)
{
return null;
}
if (declaration.DeclarationType == DeclarationType.ClassModule || declaration.DeclarationType == DeclarationType.ProceduralModule)
if (declaration.DeclarationType.HasFlag(DeclarationType.ClassModule) || declaration.DeclarationType == DeclarationType.ProceduralModule)
{
return declaration;
}
Expand Down Expand Up @@ -546,6 +546,7 @@ public string Scope
case DeclarationType.Project:
return "VBE";
case DeclarationType.ClassModule:
case DeclarationType.Document:
case DeclarationType.ProceduralModule:
return QualifiedModuleName.ToString();
case DeclarationType.Procedure:
Expand Down

0 comments on commit 189aa1c

Please sign in to comment.