private void ValidateBaseClass(ClassDeclaration originalDecl, ClassDefinition classDef)
{
var extensionFactory = new ExtensionFactory();
var extensions = extensionFactory.GetExtensions(classDef.Symbol);
if (!extensions.Any(e => e.GetType() == typeof(ScriptObjectLiteralExtension)) &&
(classDef.Constructors.Any(c => !c.Symbol.IsImplicitlyDeclared) ||
classDef.Methods.Any(m => !m.Symbol.IsImplicitlyDeclared) ||
classDef.Properties.Any(p => p.MemberKind != MemberDefinitionKind.Field) ||
classDef.Fields.Any(f => f.MemberKind != MemberDefinitionKind.Field)))
{
throw new CompilationException("A class using the [ScriptObjectLiteral] attribute cannot inherit from class " + classDef.Symbol.GetFullName() +
", because it contains one or more declarations that are not compatible with object literal notations.", originalDecl);
}
if (classDef.BaseClass != null && classDef.BaseClass.Symbol.SpecialType != Roslyn.Compilers.SpecialType.System_Object)
ValidateBaseClass(originalDecl, classDef.BaseClass);
}
}