javac编译流程(3)将传入参数进行处理

本文继续上篇javac编译流程的探讨,主要聚焦于参数处理阶段。从appendParsedCommandArgs方法开始,逐步剖析Arguments的创建过程,包括从context中获取或创建本类及其成员变量。接着,详细讲解processArgs、doProcessArgs以及handleOption方法,特别是handleOption方法中对参数如sourcefile的特殊处理,以及通用的process方法和handleReleaseOptions方法,用于处理–release参数与其他选项的冲突。
摘要由CSDN通过智能技术生成

接上文javac编译流程(2)处理空值

我们继续查看

try {
   
            argv = CommandLine.parse(ENV_OPT_NAME, argv);
        } catch (UnmatchedQuote ex) {
   
            error("err.unmatched.quote", ex.variableName);
            return Result.CMDERR;
        } catch (FileNotFoundException | NoSuchFileException e) {
   
            warning("err.file.not.found", e.getMessage());
            return Result.SYSERR;
        } catch (IOException ex) {
   
            log.printLines(PrefixKind.JAVAC, "msg.io");
            ex.printStackTrace(log.getWriter(WriterKind.NOTICE));
            return Result.SYSERR;
        }

这段代码比较简单,跳过包装类,直接进入parse

public static List<String> parse(String envVariable, List<String> args)
            throws IOException, UnmatchedQuote {
   
		
        List<String> inArgs = new ArrayList<>();
        //尝试调用System.getenv查看是否有系统附带的Javac参数
        appendParsedEnvVariables(inArgs, envVariable);
        //将系统Javac参数和我们传入的Javac参数合并
        inArgs.addAll(args);
        List<String> newArgs = new ArrayList<>();
        //尝试查找是否有带@的参数,将其转为文件路径
        appendParsedCommandArgs(newArgs, inArgs);
        return newArgs;
    }

appendParsedCommandArgs方法

private static void appendParsedCommandArgs(List<String> newArgs, List<String> args) throws IOException {
   
        for (String arg : args) {
   
            if (arg.length() > 1 && arg.charAt(0) == '@') {
   
                arg = arg.substring(1);
                //这里是避免把类似于@@。。。这样的参数当成@<filename>处理
                if (arg.charAt(0) == '@') {
   
                    newArgs.add(arg);
                } else {
   
                	//使用io流获取文件中所有的路径信息,并进行路径转换添加至集合中
                    loadCmdFile(arg, newArgs);
                }
            } else {
   
                newArgs.add(arg);
            }
        }
    }

回到compile方法继续进行分析

//通过context对象复用之前的log和Options对象,并创建Arguments对象
Arguments args = Arguments.instance(context);
//对参数进行简单校验
args.init(ownName, argv);

创建Arguments的流程我这里就不做过多的介绍,基本和之前的创建流程一致,先尝试能否从context中获取本类,若不能,创建本类,并将本类对象放入context中,再尝试能否获取所需的成员变量,获取成员变量流程与获取本类流程一致,比较无聊,我们直接进入init

public void init(String ownName, String... args) {
   
        this.ownName = ownName;
        errorMode = ErrorMode.LOG;
        files = new LinkedHashSet<>();
        deferredFileManagerOptions = new LinkedHashMap<>();
        fileObjects = null;
        classNames = new LinkedHashSet<>();
        //真正处理输入参数的方法
        //Option.getJavaCompilerOptions()为Option中所有的枚举类型
        processArgs(List.from(args
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值