@@ -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 ,
@@ -5827,88 +5822,12 @@ pub fn resolveExpressionTypeFromAncestors(
58275822 return try ty .instanceTypeVal (analyser );
58285823 }
58295824
5830- if (std .mem .eql (u8 , call_name , "@branchHint" )) {
5831- if (params .len == 0 ) return null ;
5832- if (params [0 ] != node ) return null ;
5833- return analyser .instanceStdBuiltinType ("BranchHint" );
5834- }
5835-
5836- if (std .mem .eql (u8 , call_name , "@atomicLoad" )) {
5837- if (params .len <= 2 ) return null ;
5838- if (params [2 ] != node ) return null ;
5839- return analyser .instanceStdBuiltinType ("AtomicOrder" );
5840- }
5841-
5842- if (std .mem .eql (u8 , call_name , "@atomicRmw" )) {
5843- if (params .len > 2 and params [2 ] == node )
5844- return analyser .instanceStdBuiltinType ("AtomicRmwOp" );
5845- if (params .len > 4 and params [4 ] == node )
5846- return analyser .instanceStdBuiltinType ("AtomicOrder" );
5847- return null ;
5848- }
5849-
5850- if (std .mem .eql (u8 , call_name , "@atomicStore" )) {
5851- if (params .len <= 3 ) return null ;
5852- if (params [3 ] != node ) return null ;
5853- return analyser .instanceStdBuiltinType ("AtomicOrder" );
5854- }
5855-
5856- if (std .mem .eql (u8 , call_name , "@cmpxchgStrong" )) {
5857- if (params .len > 4 and params [4 ] == node )
5858- return analyser .instanceStdBuiltinType ("AtomicOrder" );
5859- if (params .len > 5 and params [5 ] == node )
5860- return analyser .instanceStdBuiltinType ("AtomicOrder" );
5861- return null ;
5862- }
5863-
5864- if (std .mem .eql (u8 , call_name , "@cmpxchgWeak" )) {
5865- if (params .len > 4 and params [4 ] == node )
5866- return analyser .instanceStdBuiltinType ("AtomicOrder" );
5867- if (params .len > 5 and params [5 ] == node )
5868- return analyser .instanceStdBuiltinType ("AtomicOrder" );
5869- return null ;
5870- }
5871-
5872- if (std .mem .eql (u8 , call_name , "@call" )) {
5873- if (params .len == 0 ) return null ;
5874- if (params [0 ] != node ) return null ;
5875- return analyser .instanceStdBuiltinType ("CallModifier" );
5876- }
5877-
5878- if (std .mem .eql (u8 , call_name , "@export" )) {
5879- if (params .len <= 1 ) return null ;
5880- if (params [1 ] != node ) return null ;
5881- return analyser .instanceStdBuiltinType ("ExportOptions" );
5882- }
5883-
5884- if (std .mem .eql (u8 , call_name , "@extern" )) {
5885- if (params .len <= 1 ) return null ;
5886- if (params [1 ] != node ) return null ;
5887- return analyser .instanceStdBuiltinType ("ExternOptions" );
5888- }
5889-
5890- if (std .mem .eql (u8 , call_name , "@prefetch" )) {
5891- if (params .len <= 1 ) return null ;
5892- if (params [1 ] != node ) return null ;
5893- return analyser .instanceStdBuiltinType ("PrefetchOptions" );
5894- }
5895-
5896- if (std .mem .eql (u8 , call_name , "@reduce" )) {
5897- if (params .len == 0 ) return null ;
5898- if (params [0 ] != node ) return null ;
5899- return analyser .instanceStdBuiltinType ("ReduceOp" );
5900- }
5901-
5902- if (std .mem .eql (u8 , call_name , "@setFloatMode" )) {
5903- if (params .len == 0 ) return null ;
5904- if (params [0 ] != node ) return null ;
5905- return analyser .instanceStdBuiltinType ("FloatMode" );
5906- }
5907-
5908- if (std .mem .eql (u8 , call_name , "@Type" )) {
5909- if (params .len == 0 ) return null ;
5910- if (params [0 ] != node ) return null ;
5911- return analyser .instanceStdBuiltinType ("Type" );
5825+ if (version_data .builtins .get (call_name )) | data | {
5826+ const index = std .mem .indexOfScalar (Ast .Node .Index , params , node ) orelse return null ;
5827+ if (index >= data .parameters .len ) return null ;
5828+ const parameter = data .parameters [index ];
5829+ const type_str = parameter .type orelse return null ;
5830+ return analyser .instanceStdBuiltinType (type_str );
59125831 }
59135832 },
59145833
0 commit comments