Re-order `visit` match for better performance

57e40912734128f7d05e57ad63ac424f1e210a35c6d901d88d7066fd153b5e87
Alexis Sellier committed ago 1 parent 6d184f20
lib/std/lang/resolver.rad +26 -35
2536 2536
{
2537 2537
    if let ty = typeFor(self, node) {
2538 2538
        return ty;
2539 2539
    }
2540 2540
    match node.value {
2541 +
        case ast::NodeValue::Ident(name) => {
2542 +
            let sym = findAnySymbol(self.scope, name)
2543 +
                else throw emitError(self, node, ErrorKind::UnresolvedSymbol(name));
2544 +
            setNodeSymbol(self, node, sym);
2545 +
            match sym.data {
2546 +
                case SymbolData::Value { type, .. } =>
2547 +
                    return setNodeType(self, node, type),
2548 +
                case SymbolData::Constant { type, value } => {
2549 +
                    if let val = value {
2550 +
                        setNodeConstValue(self, node, val);
2551 +
                    }
2552 +
                    return setNodeType(self, node, type);
2553 +
                },
2554 +
                case SymbolData::Type(t) =>
2555 +
                    return setNodeType(self, node, Type::Nominal(t)),
2556 +
                case SymbolData::Variant { .. } =>
2557 +
                    return Type::Void,
2558 +
                case SymbolData::Module { .. } =>
2559 +
                    throw emitError(self, node, ErrorKind::UnexpectedModuleName),
2560 +
                case SymbolData::Trait(_) =>
2561 +
                    throw emitError(self, node, ErrorKind::UnexpectedTraitName),
2562 +
            }
2563 +
        },
2564 +
        case ast::NodeValue::Call(call) => return try resolveCall(self, node, call, CallCtx::Normal),
2565 +
        case ast::NodeValue::FieldAccess(access) => return try resolveFieldAccess(self, node, access),
2566 +
        case ast::NodeValue::BinOp(binop) => return try resolveBinOp(self, node, binop),
2541 2567
        case ast::NodeValue::Block(block) => return try resolveBlock(self, node, block),
2542 2568
        case ast::NodeValue::Let(decl) => return try resolveLet(self, node, decl),
2543 2569
        case ast::NodeValue::ConstDecl(decl) => return try resolveConstOrStatic(
2544 2570
            self, node, decl.ident, decl.type, decl.value, decl.attrs, true
2545 2571
        ),
2569 2595
            return setNodeType(self, node, Type::Never);
2570 2596
        },
2571 2597
        case ast::NodeValue::Match(sw) => return try resolveMatch(self, node, sw),
2572 2598
        case ast::NodeValue::MatchProng(_) => panic "visit: `MatchProng` not handled here",
2573 2599
        case ast::NodeValue::LetElse(letElse) => return try resolveLetElse(self, node, letElse),
2574 -
        case ast::NodeValue::Call(call) => return try resolveCall(self, node, call, CallCtx::Normal),
2575 2600
        case ast::NodeValue::BuiltinCall { kind, args } => return try resolveBuiltinCall(self, node, kind, args),
2576 2601
        case ast::NodeValue::Assign(assign) => return try resolveAssign(self, node, assign),
2577 2602
        case ast::NodeValue::RecordLit(lit) => return try resolveRecordLit(self, node, lit, hint),
2578 2603
        case ast::NodeValue::ArrayLit(items) => return try resolveArrayLit(self, node, items, hint),
2579 2604
        case ast::NodeValue::ArrayRepeatLit(lit) => return try resolveArrayRepeat(self, node, lit, hint),
2580 2605
        case ast::NodeValue::Subscript { container, index } => return try resolveSubscript(self, node, container, index),
2581 -
        case ast::NodeValue::FieldAccess(access) => return try resolveFieldAccess(self, node, access),
2582 2606
        case ast::NodeValue::ScopeAccess(access) => return try resolveScopeAccess(self, node, access),
2583 2607
        case ast::NodeValue::AddressOf(addr) => return try resolveAddressOf(self, node, addr, hint),
2584 2608
        case ast::NodeValue::Deref(target) => return try resolveDeref(self, node, target, hint),
2585 2609
        case ast::NodeValue::As(expr) => return try resolveAs(self, node, expr),
2586 2610
        case ast::NodeValue::Range(range) => return try resolveRange(self, node, range),
2600 2624
                item: allocType(self, Type::U8),
2601 2625
                mutable: false
2602 2626
            });
2603 2627
            return setNodeType(self, node, Type::Void);
2604 2628
        },
2605 -
        case ast::NodeValue::BinOp(binop) => return try resolveBinOp(self, node, binop),
2606 2629
        case ast::NodeValue::UnOp(unop) => return try resolveUnOp(self, node, unop),
2607 2630
        case ast::NodeValue::ExprStmt(expr) => {
2608 2631
            // Pass `Void` as expected type to indicate value is discarded.
2609 2632
            let exprTy = try visit(self, expr, Type::Void);
2610 2633
            return setNodeType(self, node, unifyBranches(exprTy, Type::Void));
2611 2634
        },
2612 2635
        case ast::NodeValue::TypeSig(sig) => return try inferTypeSig(self, node, sig),
2613 -
        case ast::NodeValue::Ident(name) => {
2614 -
            let sym = findAnySymbol(self.scope, name)
2615 -
                else throw emitError(self, node, ErrorKind::UnresolvedSymbol(name));
2616 -
            setNodeSymbol(self, node, sym);
2617 -
2618 -
            // TODO: See if we can unify this with `resolvePath`, ie. scope access.
2619 -
            match sym.data {
2620 -
                case SymbolData::Value { type, .. } => {
2621 -
                    return setNodeType(self, node, type);
2622 -
                },
2623 -
                case SymbolData::Constant { type, value } => {
2624 -
                    // Propagate constant value.
2625 -
                    if let val = value {
2626 -
                        setNodeConstValue(self, node, val);
2627 -
                    }
2628 -
                    return setNodeType(self, node, type);
2629 -
                },
2630 -
                case SymbolData::Type(t) => {
2631 -
                    return setNodeType(self, node, Type::Nominal(t));
2632 -
                },
2633 -
                case SymbolData::Variant { .. } => {
2634 -
                    return Type::Void;
2635 -
                },
2636 -
                case SymbolData::Module { .. } => {
2637 -
                    // Module identifiers alone aren't valid expressions.
2638 -
                    throw emitError(self, node, ErrorKind::UnexpectedModuleName);
2639 -
                }
2640 -
                case SymbolData::Trait(_) => {
2641 -
                    throw emitError(self, node, ErrorKind::UnexpectedTraitName);
2642 -
                }
2643 -
            }
2644 -
        },
2645 2636
        case ast::NodeValue::Super => {
2646 2637
            // `super` by itself is invalid, must be used in scope access.
2647 2638
            throw emitError(self, node, ErrorKind::InvalidModulePath);
2648 2639
        },
2649 2640
        case ast::NodeValue::Nil => {