Files
sap-cli-skill/assets/sapcli/commands/syntax_check.py
T

62 lines
2.3 KiB
Python

"""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']}")