378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
|
# File 'lib/rbs/environment.rb', line 378
def insert_decl(decl, outer:, namespace:)
case decl
when AST::Declarations::Class, AST::Declarations::Module
name = decl.name.with_prefix(namespace)
if cdecl = constant_entry(name)
if cdecl.is_a?(ConstantEntry) || cdecl.is_a?(ModuleAliasEntry) || cdecl.is_a?(ClassAliasEntry)
raise DuplicatedDeclarationError.new(name, decl, cdecl.decl)
end
end
unless class_decls.key?(name)
case decl
when AST::Declarations::Class
class_decls[name] ||= ClassEntry.new(name: name)
when AST::Declarations::Module
class_decls[name] ||= ModuleEntry.new(name: name)
end
end
existing_entry = class_decls[name]
case
when decl.is_a?(AST::Declarations::Module) && existing_entry.is_a?(ModuleEntry)
existing_entry.insert(decl: decl, outer: outer)
when decl.is_a?(AST::Declarations::Class) && existing_entry.is_a?(ClassEntry)
existing_entry.insert(decl: decl, outer: outer)
else
raise DuplicatedDeclarationError.new(name, decl, existing_entry.decls[0].decl)
end
prefix = outer + [decl]
ns = name.to_namespace
decl.each_decl do |d|
insert_decl(d, outer: prefix, namespace: ns)
end
when AST::Declarations::Interface
name = decl.name.with_prefix(namespace)
if interface_entry = interface_decls[name]
raise DuplicatedDeclarationError.new(name, decl, interface_entry.decl)
end
interface_decls[name] = InterfaceEntry.new(name: name, decl: decl, outer: outer)
when AST::Declarations::TypeAlias
name = decl.name.with_prefix(namespace)
if entry = type_alias_decls[name]
raise DuplicatedDeclarationError.new(name, decl, entry.decl)
end
type_alias_decls[name] = TypeAliasEntry.new(name: name, decl: decl, outer: outer)
when AST::Declarations::Constant
name = decl.name.with_prefix(namespace)
if entry = constant_entry(name)
case entry
when ClassAliasEntry, ModuleAliasEntry, ConstantEntry
raise DuplicatedDeclarationError.new(name, decl, entry.decl)
when ClassEntry, ModuleEntry
raise DuplicatedDeclarationError.new(name, decl, *entry.decls.map(&:decl))
end
end
constant_decls[name] = ConstantEntry.new(name: name, decl: decl, outer: outer)
when AST::Declarations::Global
if entry = global_decls[decl.name]
raise DuplicatedDeclarationError.new(decl.name, decl, entry.decl)
end
global_decls[decl.name] = GlobalEntry.new(name: decl.name, decl: decl, outer: outer)
when AST::Declarations::ClassAlias, AST::Declarations::ModuleAlias
name = decl.new_name.with_prefix(namespace)
if entry = constant_entry(name)
case entry
when ClassAliasEntry, ModuleAliasEntry, ConstantEntry
raise DuplicatedDeclarationError.new(name, decl, entry.decl)
when ClassEntry, ModuleEntry
raise DuplicatedDeclarationError.new(name, decl, *entry.decls.map(&:decl))
end
end
case decl
when AST::Declarations::ClassAlias
class_alias_decls[name] = ClassAliasEntry.new(name: name, decl: decl, outer: outer)
when AST::Declarations::ModuleAlias
class_alias_decls[name] = ModuleAliasEntry.new(name: name, decl: decl, outer: outer)
end
end
end
|