//
//
//
//
// $Revision$
//
using System;
using ICSharpCode.SharpDevelop.Dom.Refactoring;
namespace ICSharpCode.SharpDevelop.Dom
{
public class LanguageProperties
{
///
/// A case-sensitive dummy language that returns false for all Supports.. properties,
/// uses a dummy code generator and refactoring provider and returns null for CodeDomProvider.
///
public readonly static LanguageProperties None = new LanguageProperties(StringComparer.InvariantCulture);
///
/// C# 2.0 language properties.
///
public readonly static LanguageProperties CSharp = new CSharpProperties();
///
/// VB.Net 8 language properties.
///
public readonly static LanguageProperties VBNet = new VBNetProperties();
public LanguageProperties(StringComparer nameComparer)
{
this.nameComparer = nameComparer;
}
#region Language-specific service providers
readonly StringComparer nameComparer;
public StringComparer NameComparer {
get {
return nameComparer;
}
}
public virtual CodeGenerator CodeGenerator {
get {
return CodeGenerator.DummyCodeGenerator;
}
}
public virtual RefactoringProvider RefactoringProvider {
get {
return RefactoringProvider.DummyProvider;
}
}
///
/// Gets the CodeDomProvider for this language. Can return null!
///
public virtual System.CodeDom.Compiler.CodeDomProvider CodeDomProvider {
get {
return null;
}
}
sealed class DummyCodeDomProvider : System.CodeDom.Compiler.CodeDomProvider
{
public static readonly DummyCodeDomProvider Instance = new DummyCodeDomProvider();
[Obsolete("Callers should not use the ICodeGenerator interface and should instead use the methods directly on the CodeDomProvider class.")]
public override System.CodeDom.Compiler.ICodeGenerator CreateGenerator()
{
return null;
}
[Obsolete("Callers should not use the ICodeCompiler interface and should instead use the methods directly on the CodeDomProvider class.")]
public override System.CodeDom.Compiler.ICodeCompiler CreateCompiler()
{
return null;
}
}
#endregion
#region Supports...
///
/// Gets if the language supports calling C# 3-style extension methods
/// (first parameter = instance parameter)
///
public virtual bool SupportsExtensionMethods {
get {
return false;
}
}
///
/// Gets if the language supports calling extension properties
/// (first parameter = instance parameter)
///
public virtual bool SupportsExtensionProperties {
get {
return false;
}
}
///
/// Gets if extension methods/properties are searched in imported classes (returns true) or if
/// only the extensions from the current class, imported classes and imported modules are used
/// (returns false). This property has no effect if the language doesn't support
///
public virtual bool SearchExtensionsInClasses {
get {
return false;
}
}
///
/// Gets if namespaces are imported (i.e. Imports System, Dim a As Collections.ArrayList)
///
public virtual bool ImportNamespaces {
get {
return false;
}
}
///
/// Gets if modules are imported with their namespace (i.e. Microsoft.VisualBasic.Randomize()).
///
public virtual bool ImportModules {
get {
return false;
}
}
///
/// Gets if classes can be imported (i.e. Imports System.Math)
///
public virtual bool CanImportClasses {
get {
return false;
}
}
///
/// Gets if the language allows partial classes where the partial modifier is not
/// used on any part.
///
public virtual bool ImplicitPartialClasses {
get {
return false;
}
}
///
/// Allow invoking an object constructor outside of ExpressionContext.ObjectCreation.
/// Used for Boo, which creates instances like this: 'self.Size = Size(10, 20)'
///
public virtual bool AllowObjectConstructionOutsideContext {
get {
return false;
}
}
///
/// Gets if the language supports implicit interface implementations.
///
public virtual bool SupportsImplicitInterfaceImplementation {
get {
return false;
}
}
///
/// Gets if events explicitly implementing an interface require add {} remove {} regions.
///
public virtual bool RequiresAddRemoveRegionInExplicitInterfaceImplementation {
get {
return false;
}
}
///
/// Gets the token that denotes a possible beginning of an indexer expression.
///
public virtual string IndexerExpressionStartToken {
get {
return "[";
}
}
public virtual bool IsClassWithImplicitlyStaticMembers(IClass c)
{
return false;
}
#endregion
#region Code-completion filters
public virtual bool ShowInNamespaceCompletion(IClass c)
{
return true;
}
public virtual bool ShowMember(IMember member, bool showStatic)
{
if (member is IProperty && ((IProperty)member).IsIndexer) {
return false;
}
return member.IsStatic == showStatic;
}
#endregion
///
/// Generates the default imports statements a new application for this language should use.
///
public virtual IUsing CreateDefaultImports(IProjectContent pc)
{
return null;
}
public override string ToString()
{
return "[" + base.ToString() + "]";
}
#region CSharpProperties
internal sealed class CSharpProperties : LanguageProperties
{
public CSharpProperties() : base(StringComparer.InvariantCulture) {}
public override RefactoringProvider RefactoringProvider {
get {
return NRefactoryRefactoringProvider.NRefactoryCSharpProviderInstance;
}
}
public override CodeGenerator CodeGenerator {
get {
return CSharpCodeGenerator.Instance;
}
}
public override System.CodeDom.Compiler.CodeDomProvider CodeDomProvider {
get {
return new Microsoft.CSharp.CSharpCodeProvider();
}
}
public override bool SupportsImplicitInterfaceImplementation {
get {
return true;
}
}
///
/// Gets if events explicitly implementing an interface require add {} remove {} regions.
///
public override bool RequiresAddRemoveRegionInExplicitInterfaceImplementation {
get {
return true;
}
}
public override string ToString()
{
return "[LanguageProperties: C#]";
}
}
#endregion
#region VBNetProperties
internal sealed class VBNetProperties : LanguageProperties
{
public VBNetProperties() : base(StringComparer.InvariantCultureIgnoreCase) {}
public override bool ShowMember(IMember member, bool showStatic)
{
if (member is ArrayReturnType.ArrayIndexer) {
return false;
}
return member.IsStatic || !showStatic;
}
public override bool ImportNamespaces {
get {
return true;
}
}
public override bool ImportModules {
get {
return true;
}
}
public override bool CanImportClasses {
get {
return true;
}
}
public override string IndexerExpressionStartToken {
get {
return "(";
}
}
public override bool IsClassWithImplicitlyStaticMembers(IClass c)
{
return c.ClassType == ClassType.Module;
}
public override bool ShowInNamespaceCompletion(IClass c)
{
foreach (IAttribute attr in c.Attributes) {
if (NameComparer.Equals(attr.Name, "Microsoft.VisualBasic.HideModuleNameAttribute"))
return false;
if (NameComparer.Equals(attr.Name, "HideModuleNameAttribute"))
return false;
if (NameComparer.Equals(attr.Name, "Microsoft.VisualBasic.HideModuleName"))
return false;
if (NameComparer.Equals(attr.Name, "HideModuleName"))
return false;
}
return base.ShowInNamespaceCompletion(c);
}
public override IUsing CreateDefaultImports(IProjectContent pc)
{
DefaultUsing u = new DefaultUsing(pc);
u.Usings.Add("Microsoft.VisualBasic");
u.Usings.Add("System");
u.Usings.Add("System.Collections");
u.Usings.Add("System.Collections.Generic");
u.Usings.Add("System.Drawing");
u.Usings.Add("System.Diagnostics");
u.Usings.Add("System.Windows.Forms");
return u;
}
public override RefactoringProvider RefactoringProvider {
get {
return NRefactoryRefactoringProvider.NRefactoryVBNetProviderInstance;
}
}
public override CodeGenerator CodeGenerator {
get {
return VBNetCodeGenerator.Instance;
}
}
public override System.CodeDom.Compiler.CodeDomProvider CodeDomProvider {
get {
return new Microsoft.VisualBasic.VBCodeProvider();
}
}
public override string ToString()
{
return "[LanguageProperties: VB.NET]";
}
}
#endregion
}
}