@@ -23,6 +23,8 @@ pub const DocumentScope = @import("DocumentScope.zig");
2323pub const Declaration = DocumentScope .Declaration ;
2424pub const Scope = DocumentScope .Scope ;
2525
26+ const version_data = @import ("version_data" );
27+
2628const Analyser = @This ();
2729
2830gpa : std.mem.Allocator ,
@@ -2101,10 +2103,6 @@ fn resolveTypeOfNodeUncached(analyser: *Analyser, options: ResolveOptions) error
21012103 return resolved_type .typeOf (analyser );
21022104 }
21032105
2104- if (std .mem .eql (u8 , call_name , "@typeInfo" )) {
2105- return analyser .instanceStdBuiltinType ("Type" );
2106- }
2107-
21082106 const type_map : std .StaticStringMap (InternPool .Index ) = .initComptime (.{
21092107 .{ "type" , .type_type },
21102108 .{ "void" , .void_type },
@@ -2183,20 +2181,10 @@ fn resolveTypeOfNodeUncached(analyser: *Analyser, options: ResolveOptions) error
21832181 return try analyser .resolveFieldAccess (lhs , field_name );
21842182 }
21852183
2186- if (std .mem .eql (u8 , call_name , "@src" )) {
2187- return analyser .instanceStdBuiltinType ("SourceLocation" );
2188- }
2189-
21902184 if (std .mem .eql (u8 , call_name , "@compileError" )) {
21912185 return .{ .data = .{ .compile_error = node_handle }, .is_type_val = false };
21922186 }
21932187
2194- if (std .mem .eql (u8 , call_name , "@panic" ) or
2195- std .mem .eql (u8 , call_name , "@trap" ))
2196- {
2197- return Type .fromIP (analyser , .noreturn_type , null );
2198- }
2199-
22002188 if (std .mem .eql (u8 , call_name , "@Vector" )) {
22012189 if (params .len != 2 ) return null ;
22022190
@@ -2220,6 +2208,13 @@ fn resolveTypeOfNodeUncached(analyser: *Analyser, options: ResolveOptions) error
22202208
22212209 return Type .fromIP (analyser , .type_type , vector_ty_ip_index );
22222210 }
2211+
2212+ if (version_data .builtins .get (call_name )) | data | {
2213+ const type_str = data .return_type ;
2214+ if (try analyser .resolvePrimitive (type_str )) | primitive |
2215+ return Type .fromIP (analyser , primitive , null );
2216+ return analyser .instanceStdBuiltinType (type_str );
2217+ }
22232218 },
22242219 .fn_proto ,
22252220 .fn_proto_multi ,
@@ -5828,88 +5823,12 @@ pub fn resolveExpressionTypeFromAncestors(
58285823 return try ty .instanceTypeVal (analyser );
58295824 }
58305825
5831- if (std .mem .eql (u8 , call_name , "@branchHint" )) {
5832- if (params .len == 0 ) return null ;
5833- if (params [0 ] != node ) return null ;
5834- return analyser .instanceStdBuiltinType ("BranchHint" );
5835- }
5836-
5837- if (std .mem .eql (u8 , call_name , "@atomicLoad" )) {
5838- if (params .len <= 2 ) return null ;
5839- if (params [2 ] != node ) return null ;
5840- return analyser .instanceStdBuiltinType ("AtomicOrder" );
5841- }
5842-
5843- if (std .mem .eql (u8 , call_name , "@atomicRmw" )) {
5844- if (params .len > 2 and params [2 ] == node )
5845- return analyser .instanceStdBuiltinType ("AtomicRmwOp" );
5846- if (params .len > 4 and params [4 ] == node )
5847- return analyser .instanceStdBuiltinType ("AtomicOrder" );
5848- return null ;
5849- }
5850-
5851- if (std .mem .eql (u8 , call_name , "@atomicStore" )) {
5852- if (params .len <= 3 ) return null ;
5853- if (params [3 ] != node ) return null ;
5854- return analyser .instanceStdBuiltinType ("AtomicOrder" );
5855- }
5856-
5857- if (std .mem .eql (u8 , call_name , "@cmpxchgStrong" )) {
5858- if (params .len > 4 and params [4 ] == node )
5859- return analyser .instanceStdBuiltinType ("AtomicOrder" );
5860- if (params .len > 5 and params [5 ] == node )
5861- return analyser .instanceStdBuiltinType ("AtomicOrder" );
5862- return null ;
5863- }
5864-
5865- if (std .mem .eql (u8 , call_name , "@cmpxchgWeak" )) {
5866- if (params .len > 4 and params [4 ] == node )
5867- return analyser .instanceStdBuiltinType ("AtomicOrder" );
5868- if (params .len > 5 and params [5 ] == node )
5869- return analyser .instanceStdBuiltinType ("AtomicOrder" );
5870- return null ;
5871- }
5872-
5873- if (std .mem .eql (u8 , call_name , "@call" )) {
5874- if (params .len == 0 ) return null ;
5875- if (params [0 ] != node ) return null ;
5876- return analyser .instanceStdBuiltinType ("CallModifier" );
5877- }
5878-
5879- if (std .mem .eql (u8 , call_name , "@export" )) {
5880- if (params .len <= 1 ) return null ;
5881- if (params [1 ] != node ) return null ;
5882- return analyser .instanceStdBuiltinType ("ExportOptions" );
5883- }
5884-
5885- if (std .mem .eql (u8 , call_name , "@extern" )) {
5886- if (params .len <= 1 ) return null ;
5887- if (params [1 ] != node ) return null ;
5888- return analyser .instanceStdBuiltinType ("ExternOptions" );
5889- }
5890-
5891- if (std .mem .eql (u8 , call_name , "@prefetch" )) {
5892- if (params .len <= 1 ) return null ;
5893- if (params [1 ] != node ) return null ;
5894- return analyser .instanceStdBuiltinType ("PrefetchOptions" );
5895- }
5896-
5897- if (std .mem .eql (u8 , call_name , "@reduce" )) {
5898- if (params .len == 0 ) return null ;
5899- if (params [0 ] != node ) return null ;
5900- return analyser .instanceStdBuiltinType ("ReduceOp" );
5901- }
5902-
5903- if (std .mem .eql (u8 , call_name , "@setFloatMode" )) {
5904- if (params .len == 0 ) return null ;
5905- if (params [0 ] != node ) return null ;
5906- return analyser .instanceStdBuiltinType ("FloatMode" );
5907- }
5908-
5909- if (std .mem .eql (u8 , call_name , "@Type" )) {
5910- if (params .len == 0 ) return null ;
5911- if (params [0 ] != node ) return null ;
5912- return analyser .instanceStdBuiltinType ("Type" );
5826+ if (version_data .builtins .get (call_name )) | data | {
5827+ const index = std .mem .indexOfScalar (Ast .Node .Index , params , node ) orelse return null ;
5828+ if (index >= data .parameters .len ) return null ;
5829+ const parameter = data .parameters [index ];
5830+ const type_str = parameter .type orelse return null ;
5831+ return analyser .instanceStdBuiltinType (type_str );
59135832 }
59145833 },
59155834
0 commit comments