示例#1
0
文件: finder.c 项目: 8l/openvmtil
Word *
Finder_FindQualifiedIDWord ( Finder * finder, byte * token )
{
    Word * word ;

    //while ( ( symbol = _Symbol_FindAny ( token ) ) )
    while ( ( word = Finder_Word_FindUsing ( finder, token ) ) )
    {
        if ( word->CType & ( NAMESPACE ) )
        {
            Namespace * ns = ( Namespace * ) word ;
            Finder_SetQualifyingNamespace ( finder, ns ) ;
        }
        else if ( word->CType & ( OBJECT ) )
        {
            Finder_SetQualifyingNamespace ( finder, word->ContainingNamespace ) ;
        }
        else if ( word->CType & ( CLASS_MEMBER_ACCESS ) )
        {
            Finder_SetQualifyingNamespace ( finder, word->ClassFieldNamespace ) ;
        }
        else return word ;
        if ( Lexer_IsTokenForwardDotted ( _Context_->Lexer0 ) )
        {
            Lexer_ReadToken ( _Context_->Lexer0 ) ; // the '.'
            token = Lexer_ReadToken ( _Context_->Lexer0 ) ; // the namespace
            continue ;
        }

        else return word ;
    }
    return 0 ;
}
示例#2
0
文件: finder.c 项目: 8l/openvmtil
Word *
Finder_Word_FindUsing ( Finder * finder, byte * name )
{
    Word * word = 0 ;
    if ( name )
    {
        if ( finder->QualifyingNamespace )
        {
            if ( String_Equal ( ".", ( char* ) name ) ) word = Word_FindUsing ( name ) ; // keep QualifyingNamespace intact // ?? assumes function of CfrTil_Dot is always and only named "." ??
            else
#if OLD               
            {
                word = Word_FindInOneNamespace ( finder->QualifyingNamespace, name ) ;
                if ( ! GetState ( _Context_, CONTEXT_PARSING_QUALIFIED_ID ) ) Finder_SetQualifyingNamespace ( finder, 0 ) ; // nb. QualifyingNamespace is only good for one find
            }
#else            
            {
                word = Word_FindInOneNamespace ( finder->QualifyingNamespace, name ) ;
                if ( ReadLine_IsReverseTokenQualifiedID ( _Context_->ReadLiner0 ) )
                {
                    SetState ( _Context_, CONTEXT_PARSING_QUALIFIED_ID, false ) ;
                    Finder_SetQualifyingNamespace ( finder, 0 ) ; // nb. QualifyingNamespace is only good for approximately one find
                }
            }
#endif            
        }
        if ( ! word ) word = Word_FindUsing ( name ) ;
    }
    return word ;
}
示例#3
0
void
_Namespace_RemoveFromUsingListAndClear ( Namespace * ns )
{
    if ( ns )
    {
        if ( ns == _Q_->OVT_CfrTil->InNamespace ) _Q_->OVT_CfrTil->InNamespace = ( Namespace* ) dlnode_Next ( ( dlnode* ) ns ) ; //dllist_First ( (dllist*) _Q_->CfrTil->Namespaces->Lo_List ) ;
        if ( ns == _Context_->Finder0->QualifyingNamespace ) Finder_SetQualifyingNamespace ( _Context_->Finder0, 0 ) ;
        _Namespace_Clear ( ns ) ;
        dlnode_Remove ( ( dlnode* ) ns ) ;
    }
}