FROM SymbolTable IMPORT NulSym, IsModule, IsDefImp, IsRecord,
IsEnumeration, IsProcedure, GetNth,
- GetSymName, GetSym, GetLocalSym,
- UnknownReported,
+ GetSymName, GetSym, GetLocalSym, GetScope,
+ UnknownReported, IsUnknown,
+ GetUnknownOnImport, GetUnknownDeclScope,
+ ForeachExportedDo,
ForeachProcedureDo, ForeachLocalSymDo,
ForeachFieldEnumerationDo ;
PushCount : CARDINAL ;
PushCandidate: Candidates ;
+
(*
- PushName -
+ PushName - push a name to the candidate vec.
*)
PROCEDURE PushName (sym: CARDINAL) ;
cand := m2spellcheck.InitCandidates () ;
IF PushCandidates (cand, sym) > 1
THEN
- content := m2spellcheck.FindClosestCharStar (cand, string (misspelt)) ;
+ content := m2spellcheck.FindClosestCharStar (cand, string (misspelt))
ELSE
content := NIL
END ;
*)
PROCEDURE GetSpellHint (unknown: CARDINAL) : String ;
+BEGIN
+ IF IsUnknown (unknown) AND
+ GetUnknownOnImport (unknown) AND
+ (GetUnknownDeclScope (unknown) # GetScope (unknown))
+ THEN
+ (* It was created during an import statement. *)
+ RETURN GetExportedSpellHint (unknown, GetUnknownDeclScope (unknown))
+ END ;
+ RETURN GetScopeSpellHint (unknown)
+END GetSpellHint ;
+
+
+(*
+ GetExportedSpellHint - return a string describing a spelling hint
+ using the module exported identifiers.
+*)
+
+PROCEDURE GetExportedSpellHint (unknown, module: CARDINAL) : String ;
+VAR
+ content : ConstCharStar ;
+ misspell,
+ HintStr : String ;
+BEGIN
+ misspell := InitStringCharStar (KeyToCharStar (GetSymName (unknown))) ;
+ HintStr := NIL ;
+ PushCount := 0 ;
+ PushCandidate := m2spellcheck.InitCandidates () ;
+ ForeachExportedDo (module, PushName) ;
+ ForeachLocalSymDo (module, PushName) ;
+ IF PushCount > 0
+ THEN
+ content := m2spellcheck.FindClosestCharStar (PushCandidate,
+ string (misspell)) ;
+ HintStr := BuildHintStr (HintStr, content)
+ END ;
+ m2spellcheck.KillCandidates (PushCandidate) ;
+ RETURN AddPunctuation (HintStr, '?')
+END GetExportedSpellHint ;
+
+
+(*
+ GetScopeSpellHint - return a string describing a spelling hint
+ using the visible scopes.
+*)
+
+PROCEDURE GetScopeSpellHint (unknown: CARDINAL) : String ;
VAR
i, n : CARDINAL ;
sym : CARDINAL ;
INC (i)
END ;
RETURN AddPunctuation (HintStr, '?')
-END GetSpellHint ;
+END GetScopeSpellHint ;
(*
SymUndefined = RECORD
name : Name ; (* Index into name array, name *)
(* of record. *)
+ declScope : CARDINAL ; (* Scope where unknown is *)
+ (* created. *)
+ onImport : BOOLEAN ; (* Was it created during an *)
+ (* import? *)
oafamily : CARDINAL ; (* The oafamily for this sym *)
errorScope: ErrorScope ; (* Title scope used if an *)
(* error is emitted. *)
MakeObject - creates an object node.
*)
-PROCEDURE MakeObject (name: Name) : CARDINAL ;
+PROCEDURE MakeObject (tok: CARDINAL; name: Name) : CARDINAL ;
VAR
pSym: PtrToSymbol ;
Sym : CARDINAL ;
WITH pSym^ DO
SymbolType := ObjectSym ;
Object.name := name ;
- InitWhereDeclared(Object.At) ;
- InitWhereFirstUsed(Object.At)
+ InitWhereDeclaredTok (tok, Object.At) ;
+ InitWhereFirstUsedTok (tok, Object.At)
END ;
RETURN( Sym )
END MakeObject ;
THEN
(* Make unknown *)
NewSym (Sym) ;
- FillInUnknownFields (tok, Sym, SymName) ;
+ FillInUnknownFields (tok, Sym, SymName, NulSym, FALSE) ;
(* Add to unknown tree *)
AddSymToUnknownTree (ScopePtr, SymName, Sym)
(*
THEN
(* Make unknown. *)
NewSym (Sym) ;
- FillInUnknownFields (tok, Sym, SymName) ;
+ FillInUnknownFields (tok, Sym, SymName, NulSym, FALSE) ;
(* Add to unknown tree *)
AddSymToUnknownTree (ScopePtr, SymName, Sym)
(*
IF Sym=NulSym
THEN
NewSym (Sym) ;
- FillInUnknownFields (tok, Sym, SymName) ;
+ FillInUnknownFields (tok, Sym, SymName, ModSym, TRUE) ;
PutSymKey (Unresolved, SymName, Sym)
END
END
IF Sym=NulSym
THEN
NewSym(Sym) ;
- FillInUnknownFields (tok, Sym, SymName) ;
+ FillInUnknownFields (tok, Sym, SymName, ModSym, TRUE) ;
PutSymKey (Unresolved, SymName, Sym)
END
END
IF Sym=NulSym
THEN
NewSym(Sym) ;
- FillInUnknownFields (tok, Sym, SymName) ;
+ FillInUnknownFields (tok, Sym, SymName, scope, TRUE) ;
PutSymKey(Unresolved, SymName, Sym)
END
END |
IF Sym=NulSym
THEN
NewSym(Sym) ;
- FillInUnknownFields (tok, Sym, SymName) ;
+ FillInUnknownFields (tok, Sym, SymName, scope, TRUE) ;
PutSymKey(Unresolved, SymName, Sym)
END
END |
IF Sym=NulSym
THEN
NewSym(Sym) ;
- FillInUnknownFields (tok, Sym, SymName) ;
+ FillInUnknownFields (tok, Sym, SymName, NulSym, FALSE) ;
PutSymKey(Unresolved, SymName, Sym)
END
END
CheckForUnknowns (tokno, name, ExportUnQualifiedTree,
'EXPORT UNQUALIFIED') ;
CheckForSymbols (ExportRequest,
- 'requested by another modules import (symbols have not been exported by the appropriate definition module)') ;
+ 'requested by another module import' +
+ ' and the symbol has not been exported by the appropriate definition module') ;
CheckForUnknowns (tokno, name, Unresolved, 'unresolved') ;
CheckForUnknowns (tokno, name, LocalSymbols, 'locally used')
END |
VAR
s: String ;
BEGIN
- IF NOT IsEmptyTree(Tree)
+ IF DoesTreeContainAny (Tree, IsUnreportedUnknown)
THEN
s := InitString ("the symbols are unknown at the end of module {%1Ea} when ") ;
s := ConCat (s, Mark(InitString(a))) ;
MetaErrorString1 (s, MainModule) ;
- ForeachNodeDo(Tree, SymbolError)
+ ForeachNodeDo (Tree, SymbolError)
END
END CheckForSymbols ;
(*
- FillInUnknownFields -
+ FillInUnknownFields - fills in all fields for the undefined sym.
*)
-PROCEDURE FillInUnknownFields (tok: CARDINAL; sym: CARDINAL; SymName: Name) ;
+PROCEDURE FillInUnknownFields (tok: CARDINAL; sym: CARDINAL; SymName: Name;
+ descscope: CARDINAL; onimport: BOOLEAN) ;
VAR
pSym: PtrToSymbol ;
BEGIN
name := SymName ;
oafamily := NulSym ;
errorScope := GetCurrentErrorScope () ;
+ declScope := descscope ;
+ onImport := onimport ;
InitWhereFirstUsedTok (tok, At)
END
END
END FillInUnknownFields ;
+(*
+ GetUnknownOnImport - returns the onimport field of unknown sym.
+*)
+
+PROCEDURE GetUnknownOnImport (sym: CARDINAL) : BOOLEAN ;
+VAR
+ pSym: PtrToSymbol ;
+BEGIN
+ Assert (IsUnknown (sym)) ;
+ pSym := GetPsym (sym) ;
+ RETURN pSym^.Undefined.onImport
+END GetUnknownOnImport ;
+
+
+(*
+ GetUnknownDeclScope - returns the decl scope of unknown sym.
+*)
+
+PROCEDURE GetUnknownDeclScope (sym: CARDINAL) : CARDINAL ;
+VAR
+ pSym: PtrToSymbol ;
+BEGIN
+ Assert (IsUnknown (sym)) ;
+ pSym := GetPsym (sym) ;
+ RETURN pSym^.Undefined.declScope
+END GetUnknownDeclScope ;
+
+
(*
FillInPointerFields - given a new symbol, sym, make it a pointer symbol
and initialize its fields.
current scope.
*)
-PROCEDURE AddNameToScope (n: Name) ;
+PROCEDURE AddNameToScope (tok: CARDINAL; n: Name) ;
VAR
pSym : PtrToSymbol ;
scope: CARDINAL ;
WITH pSym^ DO
CASE SymbolType OF
- ProcedureSym: AddNameTo(Procedure.NamedObjects, MakeObject(n)) |
- ModuleSym : AddNameTo(Module.NamedObjects, MakeObject(n)) |
- DefImpSym : AddNameTo(DefImp.NamedObjects, MakeObject(n))
+ ProcedureSym: AddNameTo(Procedure.NamedObjects, MakeObject (tok, n)) |
+ ModuleSym : AddNameTo(Module.NamedObjects, MakeObject (tok, n)) |
+ DefImpSym : AddNameTo(DefImp.NamedObjects, MakeObject (tok, n))
ELSE
InternalError ('expecting - DefImp')
module.
*)
-PROCEDURE AddNameToImportList (n: Name) ;
+PROCEDURE AddNameToImportList (tok: CARDINAL; n: Name) ;
VAR
pSym : PtrToSymbol ;
scope: CARDINAL ;
WITH pSym^ DO
CASE SymbolType OF
- ModuleSym: AddNameTo(Module.NamedImports, MakeObject(n)) |
- DefImpSym: AddNameTo(DefImp.NamedImports, MakeObject(n))
+ ModuleSym: AddNameTo (Module.NamedImports, MakeObject (tok, n)) |
+ DefImpSym: AddNameTo (DefImp.NamedImports, MakeObject (tok, n))
ELSE
InternalError ('expecting - DefImp or Module symbol')