export function getModuleInstanceState(node: Node): ModuleInstanceState {
    
    
    if (node.kind === SyntaxKind.InterfaceDeclaration || node.kind === SyntaxKind.TypeAliasDeclaration) {
        return ModuleInstanceState.NonInstantiated;
    }
    
    else if (isConstEnumDeclaration(node)) {
        return ModuleInstanceState.ConstEnumOnly;
    }
    
    else if ((node.kind === SyntaxKind.ImportDeclaration || node.kind === SyntaxKind.ImportEqualsDeclaration) && !(node.flags & NodeFlags.Export)) {
        return ModuleInstanceState.NonInstantiated;
    }
    
    else if (node.kind === SyntaxKind.ModuleBlock) {
        let state = ModuleInstanceState.NonInstantiated;
        forEachChild(node, n => {
            switch (getModuleInstanceState(n)) {
                case ModuleInstanceState.NonInstantiated:
                    
                    return false;
                case ModuleInstanceState.ConstEnumOnly:
                    
                    state = ModuleInstanceState.ConstEnumOnly;
                    return false;
                case ModuleInstanceState.Instantiated:
                    
                    state = ModuleInstanceState.Instantiated;
                    return true;
            }
        });
        return state;
    }
    else if (node.kind === SyntaxKind.ModuleDeclaration) {
        return getModuleInstanceState((<ModuleDeclaration>node).body);
    }
    else {
        return ModuleInstanceState.Instantiated;
    }
}