62 lines
2.3 KiB
Python
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']}")
|