"""syntax-check 命令 — 对 SAP 远程对象执行语法检查(不上传不激活)。""" from __future__ import annotations import argparse import logging from sapcli.client import ADTClient from sapcli.exceptions import InvalidNameError, ObjectNotFoundError from sapcli.types import get_type_config, parse_object_name logger = logging.getLogger("sapcli.commands.syntax_check") def cmd_syntax_check(args: argparse.Namespace, client: ADTClient) -> None: """对 SAP 远程对象执行语法检查(不上传代码、不激活)。 检查 SAP 上现有对象的源码(通常是 active 状态),用于验证数据库表 结构变更后,关联程序是否报语法错误。 """ name: str = args.name obj_type: str = args.type parsed = parse_object_name(name, obj_type) type_label = get_type_config(obj_type).label if parsed.src_uri is None: print(f"\n ✗ {type_label}没有源代码,不支持 syntax-check 操作") print(f" functiongroup 等是容器对象,不包含可编辑的源代码文件") raise InvalidNameError(f"{type_label}没有源代码,不支持 syntax-check 操作") print("=" * 60) print(" SAP ADT 语法检查(远程对象,不上传不激活)") print("=" * 60) print(f" 对象类型: {type_label}") print(f" 对象名称: {parsed.display_name}") print(f"\n → 检查对象是否存在...") if not client.object_exists(parsed.obj_uri): print(f" ✗ 对象不存在: {parsed.display_name}") raise ObjectNotFoundError(parsed.display_name, obj_type) print(" ✓ 对象存在") print(f"\n → 正在执行语法检查...") ok, messages = client.syntax_check(name, parsed.obj_uri) errors = [m for m in messages if m["type"] == "E"] warnings = [m for m in messages if m["type"] == "W"] if ok: print(f"\n ✓ 语法检查通过") if warnings: print(f" ({len(warnings)} 个警告)") for w in warnings: print(f" [警告] 行 {w['line']}: {w['text']}") return print(f"\n ✗ 语法检查未通过! {len(errors)} 个错误, {len(warnings)} 个警告") for e in errors: print(f" [错误] 行 {e['line']}: {e['text']}") for w in warnings: print(f" [警告] 行 {w['line']}: {w['text']}")