diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpAmbience.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpAmbience.cs index b002d081d1..8efce50969 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpAmbience.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpAmbience.cs @@ -151,6 +151,7 @@ namespace ICSharpCode.Core builder.Append("delegate"); break; case ClassType.Class: + case ClassType.Module: builder.Append("class"); break; case ClassType.Struct: diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/MyNamespaceBuilder.cs b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/MyNamespaceBuilder.cs new file mode 100644 index 0000000000..32b42adb4d --- /dev/null +++ b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/MyNamespaceBuilder.cs @@ -0,0 +1,74 @@ +/* + * Created by SharpDevelop. + * User: Daniel Grunwald + * Date: 19.07.2005 + * Time: 18:01 + */ + +using System; +using System.Collections.Generic; +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop; +using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.SharpDevelop.Project; + +namespace VBNetBinding +{ + public static class MyNamespaceBuilder + { + public static void BuildNamespace(IProject project, IProjectContent pc) + { + ICompilationUnit cu = new DefaultCompilationUnit(pc); + const string ns = "My"; + IClass myApp = CreateMyApplication(cu, project, ns); + IClass myComp = CreateMyComputer(cu, project, ns); + cu.Classes.Add(myApp); + cu.Classes.Add(myComp); + DefaultClass c = new DefaultClass(cu, ns + ".MyProject"); + c.ClassType = ClassType.Module; + c.Modifiers = ModifierEnum.Internal | ModifierEnum.Partial | ModifierEnum.Sealed; + c.Properties.Add(new DefaultProperty("Application", + myApp.DefaultReturnType, + ModifierEnum.Internal | ModifierEnum.Static, + null, null, c)); + c.Properties.Add(new DefaultProperty("Computer", + myComp.DefaultReturnType, + ModifierEnum.Internal | ModifierEnum.Static, + null, null, c)); + c.Properties.Add(new DefaultProperty("User", + new GetClassReturnType(pc, "Microsoft.VisualBasic.ApplicationServices.User"), + ModifierEnum.Internal | ModifierEnum.Static, + null, null, c)); + cu.Classes.Add(c); + pc.UpdateCompilationUnit(null, cu, "GeneratedMyNamespace.vb", false); + } + + static IClass CreateMyApplication(ICompilationUnit cu, IProject project, string ns) + { + DefaultClass c = new DefaultClass(cu, ns + ".MyApplication"); + c.ClassType = ClassType.Class; + c.Modifiers = ModifierEnum.Internal | ModifierEnum.Partial | ModifierEnum.Sealed; + switch (project.OutputType) { + case OutputType.WinExe: + c.BaseTypes.Add("Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase"); + break; + case OutputType.Exe: + c.BaseTypes.Add("Microsoft.VisualBasic.ApplicationServices.ConsoleApplicationBase"); + break; + default: + c.BaseTypes.Add("Microsoft.VisualBasic.ApplicationServices.ApplicationBase"); + break; + } + return c; + } + + static IClass CreateMyComputer(ICompilationUnit cu, IProject project, string ns) + { + DefaultClass c = new DefaultClass(cu, ns + ".MyComputer"); + c.ClassType = ClassType.Class; + c.Modifiers = ModifierEnum.Internal | ModifierEnum.Partial | ModifierEnum.Sealed; + c.BaseTypes.Add("Microsoft.VisualBasic.Devices.Computer"); + return c; + } + } +} diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Project/VBNetProject.cs b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Project/VBNetProject.cs index a4c8c3e7f9..9712a83c11 100644 --- a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Project/VBNetProject.cs +++ b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Project/VBNetProject.cs @@ -239,6 +239,13 @@ namespace VBNetBinding imports.Add(@"$(MSBuildBinPath)\Microsoft.VisualBasic.Targets"); } + public override ParseProjectContent CreateProjectContent() + { + ParseProjectContent pc = base.CreateProjectContent(); + MyNamespaceBuilder.BuildNamespace(this, pc); + return pc; + } + void InitVB() { Language = "VBNet"; diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBNetAmbience.cs b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBNetAmbience.cs index 953ecf90bc..fc670acd09 100644 --- a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBNetAmbience.cs +++ b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBNetAmbience.cs @@ -147,6 +147,9 @@ namespace VBNetBinding case ClassType.Class: builder.Append("Class"); break; + case ClassType.Module: + builder.Append("Module"); + break; case ClassType.Struct: builder.Append("Structure"); break; @@ -242,6 +245,9 @@ namespace VBNetBinding case ClassType.Class: builder.Append("Class"); break; + case ClassType.Module: + builder.Append("Module"); + break; case ClassType.Struct: builder.Append("Structure"); break; diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/VBNetBinding.csproj b/src/AddIns/BackendBindings/VBNetBinding/Project/VBNetBinding.csproj index 864c6bd96e..00d1ff068a 100644 --- a/src/AddIns/BackendBindings/VBNetBinding/Project/VBNetBinding.csproj +++ b/src/AddIns/BackendBindings/VBNetBinding/Project/VBNetBinding.csproj @@ -52,6 +52,7 @@ Always + diff --git a/src/Libraries/NRefactory/Project/Src/Lexer/VBNet/VBNetKeywordList.txt b/src/Libraries/NRefactory/Project/Src/Lexer/VBNet/KeywordList.txt similarity index 100% rename from src/Libraries/NRefactory/Project/Src/Lexer/VBNet/VBNetKeywordList.txt rename to src/Libraries/NRefactory/Project/Src/Lexer/VBNet/KeywordList.txt diff --git a/src/Main/Base/Project/Src/Dom/ClassType.cs b/src/Main/Base/Project/Src/Dom/ClassType.cs index 27984010cf..ad93d6adbc 100644 --- a/src/Main/Base/Project/Src/Dom/ClassType.cs +++ b/src/Main/Base/Project/Src/Dom/ClassType.cs @@ -1,4 +1,4 @@ -// +// // // // @@ -12,6 +12,7 @@ namespace ICSharpCode.SharpDevelop.Dom Enum, Interface, Struct, - Delegate + Delegate, + Module } } diff --git a/src/Main/Base/Project/Src/Dom/Implementations/DefaultClass.cs b/src/Main/Base/Project/Src/Dom/Implementations/DefaultClass.cs index 5f222af4fe..8f08ae040b 100644 --- a/src/Main/Base/Project/Src/Dom/Implementations/DefaultClass.cs +++ b/src/Main/Base/Project/Src/Dom/Implementations/DefaultClass.cs @@ -288,6 +288,8 @@ namespace ICSharpCode.SharpDevelop.Dom return ReflectionReturnType.Object.GetUnderlyingClass(); } break; + case ClassType.Module: + return null; case ClassType.Enum: return ProjectContentRegistry.GetMscorlibContent().GetClass("System.Enum"); case ClassType.Delegate: @@ -371,8 +373,7 @@ namespace ICSharpCode.SharpDevelop.Dom bool isClassInInheritanceTree = callingClass.IsTypeInInheritanceTree(this); foreach (IClass c in InnerClasses) { - if (((c.ClassType == ClassType.Class) || (c.ClassType == ClassType.Struct)) && - c.IsAccessible(callingClass, isClassInInheritanceTree)) { + if (c.IsAccessible(callingClass, isClassInInheritanceTree)) { types.Add(c); } } diff --git a/src/Main/Base/Project/Src/Dom/LanguageProperties.cs b/src/Main/Base/Project/Src/Dom/LanguageProperties.cs index 9d82f28fb8..2778d886c8 100644 --- a/src/Main/Base/Project/Src/Dom/LanguageProperties.cs +++ b/src/Main/Base/Project/Src/Dom/LanguageProperties.cs @@ -28,6 +28,12 @@ namespace ICSharpCode.SharpDevelop.Dom return true; } } + + public override bool ImportModules { + get { + return true; + } + } public override string ToString() { @@ -57,6 +63,15 @@ namespace ICSharpCode.SharpDevelop.Dom } } + /// + /// Gets if modules are imported with their namespace (i.e. Microsoft.VisualBasic.Randomize()). + /// + public virtual bool ImportModules { + get { + return false; + } + } + public virtual bool ShowMember(IMember member, bool showStatic) { return member.IsStatic == showStatic; diff --git a/src/Main/Base/Project/Src/Dom/ModifierEnum.cs b/src/Main/Base/Project/Src/Dom/ModifierEnum.cs index 1412ed98ed..66c6f2b8e8 100644 --- a/src/Main/Base/Project/Src/Dom/ModifierEnum.cs +++ b/src/Main/Base/Project/Src/Dom/ModifierEnum.cs @@ -1,4 +1,4 @@ -// +// // // // @@ -25,7 +25,7 @@ namespace ICSharpCode.SharpDevelop.Dom Static = 0x0080, Override = 0x0100, Readonly = 0x0200, - Const = 0X0400, + Const = 0x0400, New = 0x0800, // Special @@ -39,6 +39,7 @@ namespace ICSharpCode.SharpDevelop.Dom SpecialName = 0x20000, Final = 0x40000, + Partial = 0x80000, } } diff --git a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryASTConvertVisitor.cs b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryASTConvertVisitor.cs index da2181ab8b..214d6682fa 100644 --- a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryASTConvertVisitor.cs +++ b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryASTConvertVisitor.cs @@ -242,9 +242,11 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver return ClassType.Interface; case AST.Types.Struct: return ClassType.Struct; + case AST.Types.Module: + return ClassType.Module; + default: + return ClassType.Class; } - // Class and Module - return ClassType.Class; } DefaultRegion GetRegion(Point start, Point end) diff --git a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs index 3ff1adc2ca..9e12ba57f8 100644 --- a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs +++ b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs @@ -252,21 +252,28 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver ResolveResult ResolveMemberReferenceExpression(IReturnType type, FieldReferenceExpression fieldReferenceExpression) { IClass c; - string name = SearchNamespace(type.FullyQualifiedName, this.CompilationUnit); - // TODO: Test directly for NamespaceReturnType - if (name != null) { - name += "." + fieldReferenceExpression.FieldName; - string n = SearchNamespace(name, null); - if (n != null) { - return new NamespaceResolveResult(callingClass, callingMember, n); - } - c = SearchType(name, this.CallingClass, this.CompilationUnit); + IMember member; + TypeVisitor.NamespaceReturnType namespaceRT = type as TypeVisitor.NamespaceReturnType; + if (namespaceRT != null) { + string combinedName = namespaceRT.FullyQualifiedName + "." + fieldReferenceExpression.FieldName; + if (projectContent.NamespaceExists(combinedName)) { + return new NamespaceResolveResult(callingClass, callingMember, combinedName); + } + c = projectContent.GetClass(combinedName); if (c != null) { return new TypeResolveResult(callingClass, callingMember, c); } + if (languageProperties.ImportModules) { + // go through the members of the modules + foreach (object o in projectContent.GetNamespaceContents(namespaceRT.FullyQualifiedName)) { + member = o as IMember; + if (member != null && IsSameName(member.Name, fieldReferenceExpression.FieldName)) + return CreateMemberResolveResult(member); + } + } return null; } - IMember member = GetMember(type, fieldReferenceExpression.FieldName); + member = GetMember(type, fieldReferenceExpression.FieldName); if (member != null) return CreateMemberResolveResult(member); c = type.GetUnderlyingClass(); @@ -471,7 +478,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver return null; } - bool IsSameName(string name1, string name2) + public bool IsSameName(string name1, string name2) { return languageProperties.NameComparer.Equals(name1, name2); } diff --git a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/TypeVisitor.cs b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/TypeVisitor.cs index 0ff73b0c06..b176203640 100644 --- a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/TypeVisitor.cs +++ b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/TypeVisitor.cs @@ -227,16 +227,25 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver } IReturnType returnType = fieldReferenceExpression.TargetObject.AcceptVisitor(this, data) as IReturnType; if (returnType != null) { - string name = resolver.SearchNamespace(returnType.FullyQualifiedName, resolver.CompilationUnit); - if (name != null) { - string n = resolver.SearchNamespace(name + "." + fieldReferenceExpression.FieldName, null); - if (n != null) { - return new NamespaceReturnType(n); + NamespaceReturnType namespaceRT = returnType as NamespaceReturnType; + if (namespaceRT != null) { + string name = namespaceRT.FullyQualifiedName; + string combinedName = name + "." + fieldReferenceExpression.FieldName; + if (resolver.ProjectContent.NamespaceExists(combinedName)) { + return new NamespaceReturnType(combinedName); } - IClass c = resolver.SearchType(name + "." + fieldReferenceExpression.FieldName, resolver.CallingClass, resolver.CompilationUnit); + IClass c = resolver.ProjectContent.GetClass(combinedName); if (c != null) { return c.DefaultReturnType; } + if (resolver.LanguageProperties.ImportModules) { + // go through the members of the modules + foreach (object o in resolver.ProjectContent.GetNamespaceContents(name)) { + IMember member = o as IMember; + if (member != null && resolver.IsSameName(member.Name, fieldReferenceExpression.FieldName)) + return member.ReturnType; + } + } return null; } return resolver.SearchMember(returnType, fieldReferenceExpression.FieldName); @@ -500,7 +509,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver return t; } - class NamespaceReturnType : AbstractReturnType + public class NamespaceReturnType : AbstractReturnType { public NamespaceReturnType(string fullName) { diff --git a/src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionClass.cs b/src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionClass.cs index ecb78acfe2..b652bb93ec 100644 --- a/src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionClass.cs +++ b/src/Main/Base/Project/Src/Dom/ReflectionLayer/ReflectionClass.cs @@ -175,6 +175,7 @@ namespace ICSharpCode.SharpDevelop.Dom } else if (IsDelegate(type)) { this.ClassType = ClassType.Delegate; } else { + // TODO: Check if class is a module. this.ClassType = ClassType.Class; } if (type.IsGenericTypeDefinition) { diff --git a/src/Main/Base/Project/Src/Project/AbstractProject.cs b/src/Main/Base/Project/Src/Project/AbstractProject.cs index a77c664ea0..8ec58d072a 100644 --- a/src/Main/Base/Project/Src/Project/AbstractProject.cs +++ b/src/Main/Base/Project/Src/Project/AbstractProject.cs @@ -363,7 +363,14 @@ namespace ICSharpCode.SharpDevelop.Project return null; } - + /// + /// Creates a new project content for this project. + /// This method should only be called by ParserService.LoadSolutionProjectsInternal()! + /// + public virtual ParseProjectContent CreateProjectContent() + { + return ParseProjectContent.CreateUninitalized(this); + } /// /// Saves project preferences (currently opened files, bookmarks etc.) to the diff --git a/src/Main/Base/Project/Src/Project/IProject.cs b/src/Main/Base/Project/Src/Project/IProject.cs index 5c4556b1c6..039bd149fb 100644 --- a/src/Main/Base/Project/Src/Project/IProject.cs +++ b/src/Main/Base/Project/Src/Project/IProject.cs @@ -103,6 +103,12 @@ namespace ICSharpCode.SharpDevelop.Project void Start(bool withDebugging); + /// + /// Creates a new project content for this project. + /// This method should only be called by ParserService.LoadSolutionProjectsInternal()! + /// + ParseProjectContent CreateProjectContent(); + CompilerResults Build(); CompilerResults Rebuild(); CompilerResults Clean(); diff --git a/src/Main/Base/Project/Src/Services/AmbienceService/NetAmbience.cs b/src/Main/Base/Project/Src/Services/AmbienceService/NetAmbience.cs index 14fa54a474..367187cc53 100644 --- a/src/Main/Base/Project/Src/Services/AmbienceService/NetAmbience.cs +++ b/src/Main/Base/Project/Src/Services/AmbienceService/NetAmbience.cs @@ -1,4 +1,4 @@ -// +// // // // @@ -30,6 +30,9 @@ namespace ICSharpCode.Core case ClassType.Class: builder.Append("Class"); break; + case ClassType.Module: + builder.Append("Module"); + break; case ClassType.Struct: builder.Append("Structure"); break; diff --git a/src/Main/Base/Project/Src/Services/ParserService/DefaultProjectContent.cs b/src/Main/Base/Project/Src/Services/ParserService/DefaultProjectContent.cs index 8a5bc4b99a..b99d0ce4b0 100644 --- a/src/Main/Base/Project/Src/Services/ParserService/DefaultProjectContent.cs +++ b/src/Main/Base/Project/Src/Services/ParserService/DefaultProjectContent.cs @@ -391,7 +391,19 @@ namespace ICSharpCode.Core Dictionary dict = GetNamespaces(language); if (dict.ContainsKey(nameSpace)) { NamespaceStruct ns = dict[nameSpace]; - list.AddRange(ns.Classes); + int newCapacity = list.Count + ns.Classes.Count + ns.SubNamespaces.Count; + if (list.Capacity < newCapacity) + list.Capacity = newCapacity; + if (language.ImportModules) { + foreach (IClass c in ns.Classes) { + list.Add(c); + if (c.ClassType == ClassType.Module) { + list.AddRange(c.GetAccessibleMembers(null, true)); + } + } + } else { + list.AddRange(ns.Classes); + } foreach (string subns in ns.SubNamespaces) { if (!list.Contains(subns)) list.Add(subns); diff --git a/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs b/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs index a0430767ec..eeefb1c568 100644 --- a/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs +++ b/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs @@ -125,7 +125,7 @@ namespace ICSharpCode.Core List createdContents = new List(); foreach (IProject project in ProjectService.OpenSolution.Projects) { try { - ParseProjectContent newContent = ParseProjectContent.CreateUninitalized(project); + ParseProjectContent newContent = project.CreateProjectContent(); lock (projectContents) { projectContents[project] = newContent; }