typeast.cs

来自「charp compiler」· CS 代码 · 共 629 行 · 第 1/2 页

CS
629
字号
        
        m_filerange = tElem.Location;
        m_cDimension = dimension;
        
        Debug.Assert(!tElem.CLRType.IsByRef, "Can't make an array of references");
        m_sigBase = null;
        m_ArrayTypeRec = 
        Debug.Assert(m_ArrayTypeRec != null);
    }
    */
#endregion

#region Properties
    NonRefTypeSig m_sigBase;
/*
    public TypeSig ElemTypeNode
    {
        get { return m_sigBase; }
    }
*/
    public TypeEntry ElemType
    {
        get {
            if (m_ArrayTypeRec == null)
                return m_sigBase.BlueType;
            return m_ArrayTypeRec.ElemType;
        }
    }

    int m_cDimension;
    public int Dimension
    {
        get { return m_cDimension;}
    }

    protected ArrayTypeEntry m_ArrayTypeRec;
    public ArrayTypeEntry ArrayTypeRec
    {
        get { return m_ArrayTypeRec; }
    }

#endregion

    // Get the resolved type
    // Same as ArrayTypeRec, but not type safe
    public override TypeEntry BlueType
    {
        get { return m_ArrayTypeRec; }
    }
        
    // ArrayType is always an array 
    public override bool IsArray
    {
        get { return true; }
    }
    
    // trivially true..
    public override ArrayTypeSig AsArraySig
    {
        get { return this; }
    }
    
#region Checks

#if false            
    public override string ToString()
    {
        // First get the non-array type

        TypeSig t = m_sigBase;
        while(t.IsArray)
        t = t.AsArraySig.ElemType;

        string stBase = t.ToString();
            
        t = this;
        while(t.IsArray)
        {
            stBase = stBase + "[";
            for(int i = 0; i < t.AsArraySig.Dimension - 1; i++)
            stBase += ",";
            stBase += "]";
                    
            t = t.AsArraySig.ElemType;
        }
        
        return stBase;
    }
#endif        
        
    public override void DebugCheck(ISemanticResolver s)
    {
        ElemType.DebugCheck(s);
        Debug.Assert(m_ArrayTypeRec != null);
            
        // Parallel data structures:
        // (ArrayTypeSig : TypeSig) as (ArrayTypeEntry : TypeEntry)
        // So verify the integrity there
        if (m_sigBase != null)
        {
            Debug.Assert(m_sigBase.BlueType == m_ArrayTypeRec.ElemType);
        }
                
    } // DebugCheck

    // Dump as XML
    public override void Dump(XmlWriter o)
    {
        o.WriteStartElement("ArrayTypeSig");
        o.WriteAttributeString("Dimension", m_cDimension.ToString());
        o.WriteAttributeString("fulltype", ToString());
                    
        if (m_sigBase != null)
            m_sigBase.Dump(o);
                        
        o.WriteEndElement();
    }
#endregion
    // Semantic resolution
    public override void ResolveType(ISemanticResolver s)
    {
        if (m_ArrayTypeRec != null)
            return;
            
        m_sigBase.ResolveType(s);
        m_ArrayTypeRec = new ArrayTypeEntry(this, s);
    }
}

#region Reference Type
//-----------------------------------------------------------------------------    
// Reference
//-----------------------------------------------------------------------------    
public class RefTypeSig : TypeSig
{
#region Construction
    // Create around an existing type
    public RefTypeSig(NonRefTypeSig sig)        
    {
        Debug.Assert(sig != null);
        m_tElem = sig;
    }
#endregion

#region Properties & Data
    // We hold a reference to a non-reference type.
    // Can't have reference to references. (These ain't pointers!)
    NonRefTypeSig m_tElem;

    // Track our internal symbol
    RefTypeEntry m_tRefEntry;

    // Get the blue & clr symbols
    public override TypeEntry BlueType
    {
        get { return m_tRefEntry; }
    }
        
    public override Type CLRType
    {
        get { return m_tRefEntry.CLRType; }
    }    
    
    // References are pretty transparent. So For array checks, we just pass right
    // through to our element type.
    public override bool IsArray
    {
        get { 
            return m_tElem.IsArray; 
        }
    }
    
    public override ArrayTypeSig AsArraySig
    {
        get {
            return m_tElem.AsArraySig;
        }
    }
#endregion

    // Semantic resolution
    public override void ResolveType(ISemanticResolver s)
    {        
        if (m_tRefEntry != null)
            return;
            
        m_tElem.ResolveType(s);
        
        m_tRefEntry = new RefTypeEntry(m_tElem.BlueType, s);
    }
    
#region Checks
    public override void DebugCheck(ISemanticResolver s)
    {
        base.DebugCheck(s);
        Debug.Assert(CLRType.IsByRef, "Ref type must wrap a ref");
        Debug.Assert(!m_tElem.BlueType.CLRType.IsByRef, "Can't have ref to ref");
    }
#endregion    
    
} // end RefTypeSig

#endregion Reference Type




#region Array Initializer

//-----------------------------------------------------------------------------    
// Array Initilizer - list of either expressions or nested ArrayInitliazers
// ArrayInitializers are not expressions, they're just part of the NewObjExp.
//-----------------------------------------------------------------------------    
public class ArrayInitializer : Node
{
    // Create an array initializer from the list
    public ArrayInitializer(System.Collections.ArrayList al)
    {
        m_list = new Node[al.Count];
        for(int i = 0; i < m_list.Length; i++)
            m_list[i] = (Node) al[i];
    }
    
    public ArrayInitializer(Node[] list)
    {
        m_list= list;
    }
    
    Node [] m_list;
    
    protected Node [] List
    {
        get { return m_list; }
    }
    
    public int Length
    {
        get { return m_list.Length; }
    }
    
    public Exp GetExpAt(int idx)
    {
        return (Exp) m_list[idx];
    }
    
#region checks
    public override void DebugCheck(ISemanticResolver s)    
    {
        foreach(Node n in List)
        {
            n.DebugCheck(s);
        }
    }
    
    // Dump as XML
    public override void Dump(XmlWriter o)
    {
        o.WriteStartElement("ArrayInitializer");
        
        foreach(Node n in List)
        {
            n.Dump(o); 
        }
                            
        o.WriteEndElement();
    }
#endregion

#region Resolution
    // Resolve this array initializer list.
    // Provide with the type that we expect each element in the list to be
    public void Resolve(ISemanticResolver s, TypeEntry tExpected)
    {
        // Each node must either be an expression or a nested array initializer list
        //foreach(Node n in List)
        for(int i = 0; i < m_list.Length; i++)
        {
            Node n = m_list[i]; 
            if (n is Exp)
            {
                Exp e = (Exp) n;
                Exp.ResolveExpAsRight(ref e, s);
                m_list[i] = e;
                
                s.EnsureAssignable(e, tExpected.CLRType);
            } 
            
            else if (n is ArrayInitializer)
            {
                Debug.Assert(tExpected.IsArray); // @todo -legit
                
                ArrayInitializer a = (ArrayInitializer) n;
                TypeEntry tNested = tExpected.AsArrayType.ElemType;
                
                a.Resolve(s, tNested);
            }
            
            else 
            {
                // Error
                Debug.Assert(false); // @todo - legit
            }
        
        }
    }


#endregion
}

#endregion ArrayInitializer


} // namespace AST

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?