|
17 | 17 | --
|
18 | 18 | -- This package provides GPR references API.
|
19 | 19 |
|
| 20 | +with Gpr_Parser.Common; |
| 21 | + |
20 | 22 | package LSP.GPR_Files.References is
|
21 | 23 |
|
| 24 | + type Reference is private; |
| 25 | + |
| 26 | + type Ref_Kind is |
| 27 | + (No_Ref, Project_Ref, Type_Ref, Variable_Ref, Attribute_Ref, Package_Ref); |
| 28 | + |
| 29 | + function Kind (Ref : Reference) return Ref_Kind; |
| 30 | + |
22 | 31 | function Token_Reference
|
23 | 32 | (File : LSP.GPR_Files.File_Access;
|
24 | 33 | Position : LSP.Structures.Position)
|
25 | 34 | return Gpr_Parser.Common.Token_Reference;
|
26 | 35 |
|
| 36 | + function Identifier_Reference |
| 37 | + (File : LSP.GPR_Files.File_Access; |
| 38 | + Current_Package : GPR2.Package_Id; |
| 39 | + Token : Gpr_Parser.Common.Token_Reference) |
| 40 | + return Reference; |
| 41 | + -- return the Project, Type, Variable, Attribute, Package reference |
| 42 | + -- found at 'Location'. 'Current_Package' useful for package's variable. |
| 43 | + |
| 44 | + function Referenced_File |
| 45 | + (File : LSP.GPR_Files.File_Access; |
| 46 | + Reference : LSP.GPR_Files.References.Reference) |
| 47 | + return LSP.GPR_Files.File_Access; |
| 48 | + |
| 49 | + function Referenced_Package |
| 50 | + (Reference : LSP.GPR_Files.References.Reference) |
| 51 | + return GPR2.Package_Id; |
| 52 | + |
| 53 | + function Has_Project |
| 54 | + (Reference : LSP.GPR_Files.References.Reference) return Boolean; |
| 55 | + |
| 56 | + function Is_Project_Reference |
| 57 | + (Reference : LSP.GPR_Files.References.Reference) return Boolean; |
| 58 | + |
| 59 | + function Has_Package |
| 60 | + (Reference : LSP.GPR_Files.References.Reference) return Boolean; |
| 61 | + |
| 62 | + function Is_Package_Reference |
| 63 | + (Reference : LSP.GPR_Files.References.Reference) return Boolean; |
| 64 | + |
| 65 | + function Is_Type_Reference |
| 66 | + (Reference : LSP.GPR_Files.References.Reference) return Boolean; |
| 67 | + |
| 68 | + function Is_Variable_Reference |
| 69 | + (Reference : LSP.GPR_Files.References.Reference) return Boolean; |
| 70 | + |
| 71 | + function Is_Attribute_Reference |
| 72 | + (Reference : LSP.GPR_Files.References.Reference) return Boolean; |
| 73 | + |
| 74 | + function In_Type_Reference |
| 75 | + (Reference : LSP.GPR_Files.References.Reference) return Boolean; |
| 76 | + |
| 77 | + No_Reference : constant Reference; |
| 78 | + -- No reference found |
| 79 | + |
| 80 | + function Get_Referenced_File |
| 81 | + (File : LSP.GPR_Files.File_Access; |
| 82 | + Reference : LSP.GPR_Files.References.Reference) |
| 83 | + return LSP.GPR_Files.File_Access; |
| 84 | + |
| 85 | +private |
| 86 | + |
| 87 | + package GPC renames Gpr_Parser.Common; |
| 88 | + |
| 89 | + type Reference (Kind : Ref_Kind := No_Ref) is record |
| 90 | + Token : Gpr_Parser.Common.Token_Reference := GPC.No_Token; |
| 91 | + case Kind is |
| 92 | + when No_Ref => |
| 93 | + null; |
| 94 | + when others => |
| 95 | + Project : Project_Id := No_Project; |
| 96 | + In_Type_Reference : Boolean := False; |
| 97 | + case Kind is |
| 98 | + when Project_Ref => |
| 99 | + null; |
| 100 | + when Type_Ref => |
| 101 | + Typ : Type_Id := No_Type; |
| 102 | + when others => |
| 103 | + Pack : GPR2.Package_Id := GPR2.Project_Level_Scope; |
| 104 | + case Kind is |
| 105 | + when Variable_Ref => |
| 106 | + Variable : Variable_Id := No_Variable; |
| 107 | + when Attribute_Ref => |
| 108 | + Attribute : GPR2.Optional_Attribute_Id := |
| 109 | + GPR2.No_Attribute; |
| 110 | + Index : Index_Type := No_Index; |
| 111 | + when others => |
| 112 | + null; |
| 113 | + end case; |
| 114 | + end case; |
| 115 | + end case; |
| 116 | + end record; |
| 117 | + |
| 118 | + No_Reference : constant Reference := (Kind => No_Ref, Token => GPC.No_Token); |
| 119 | + -- No reference found |
| 120 | + |
| 121 | + function Has_Project |
| 122 | + (Reference : LSP.GPR_Files.References.Reference) return Boolean is |
| 123 | + (Reference.Kind /= No_Ref); |
| 124 | + |
| 125 | + function Is_Project_Reference |
| 126 | + (Reference : LSP.GPR_Files.References.Reference) return Boolean is |
| 127 | + (Reference.Kind = Project_Ref); |
| 128 | + |
| 129 | + function Has_Package |
| 130 | + (Reference : LSP.GPR_Files.References.Reference) return Boolean is |
| 131 | + (Reference.Kind not in No_Ref | Project_Ref | Type_Ref); |
| 132 | + |
| 133 | + function Is_Package_Reference |
| 134 | + (Reference : LSP.GPR_Files.References.Reference) return Boolean is |
| 135 | + (Reference.Kind = Package_Ref); |
| 136 | + |
| 137 | + function Is_Type_Reference |
| 138 | + (Reference : LSP.GPR_Files.References.Reference) return Boolean is |
| 139 | + (Reference.Kind = Type_Ref); |
| 140 | + |
| 141 | + function Is_Variable_Reference |
| 142 | + (Reference : LSP.GPR_Files.References.Reference) return Boolean is |
| 143 | + (Reference.Kind = Variable_Ref); |
| 144 | + |
| 145 | + function Is_Attribute_Reference |
| 146 | + (Reference : LSP.GPR_Files.References.Reference) return Boolean is |
| 147 | + (Reference.Kind = Attribute_Ref); |
| 148 | + |
| 149 | + function In_Type_Reference |
| 150 | + (Reference : LSP.GPR_Files.References.Reference) return Boolean is |
| 151 | + (if Reference.Kind in Project_Ref | Type_Ref | Package_Ref |
| 152 | + then Reference.In_Type_Reference |
| 153 | + else False); |
| 154 | + |
27 | 155 | end LSP.GPR_Files.References;
|
0 commit comments