private void GetAppFromDirectory(string path, List <Program> list, int depth) { if (MaxDepth != -1 && depth > MaxDepth) { return; } try { foreach (var file in Directory.GetFiles(path)) { if (Suffixes.Any(o => file.EndsWith("." + o))) { var p = CreateEntry(file); p.Source = this; list.Add(p); } } foreach (var subDirectory in Directory.GetDirectories(path)) { GetAppFromDirectory(subDirectory, list, depth + 1); } } catch (Exception e) { var woxPluginException = new WoxPluginException("Program", $"GetAppFromDirectory failed: {path}", e); Log.Exception(woxPluginException); } }
public override List <Program> LoadPrograms() { List <Program> list = new List <Program>(); foreach (var Folder in Directory.GetDirectories(BaseDirectory)) { list.Add(CreateEntry(Folder)); } foreach (string file in Directory.GetFiles(base.BaseDirectory)) { if (Suffixes.Any(o => file.EndsWith("." + o))) { list.Add(CreateEntry(file)); } } return(list); }
public string Generate(uint modelId, string source) { var split = PreGenerate(modelId, source); if (split == null) { return(null); } split = Process(split); if (split == null) { return(null); } var last = split.Last(); if (Suffixes.Any(t => t.Equals(last)) == true) { split = Trim(split); } return(PostProcess(split)); }
private IEnumerable <MsilInstruction> EmitPatched(Func <Type, bool, MsilLocal> declareLocal) { var methodBody = _method.GetMethodBody(); Debug.Assert(methodBody != null, "Method body is null"); foreach (var localVar in methodBody.LocalVariables) { Debug.Assert(localVar.LocalType != null); declareLocal(localVar.LocalType, localVar.IsPinned); } var instructions = new List <MsilInstruction>(); var specialVariables = new Dictionary <string, MsilLocal>(); var labelAfterOriginalContent = new MsilLabel(); var labelSkipMethodContent = new MsilLabel(); Type returnType = _method is MethodInfo meth ? meth.ReturnType : typeof(void); MsilLocal resultVariable = null; if (returnType != typeof(void)) { if (Prefixes.Concat(Suffixes).SelectMany(x => x.GetParameters()).Any(x => x.Name == RESULT_PARAMETER) || Prefixes.Any(x => x.ReturnType == typeof(bool))) { resultVariable = declareLocal(returnType, false); } } if (resultVariable != null) { instructions.AddRange(resultVariable.SetToDefault()); } MsilLocal prefixSkippedVariable = null; if (Prefixes.Count > 0 && Suffixes.Any(x => x.GetParameters() .Any(y => y.Name.Equals(PREFIX_SKIPPED_PARAMETER)))) { prefixSkippedVariable = declareLocal(typeof(bool), false); specialVariables.Add(PREFIX_SKIPPED_PARAMETER, prefixSkippedVariable); } if (resultVariable != null) { specialVariables.Add(RESULT_PARAMETER, resultVariable); } // Create special variables foreach (var m in Prefixes.Concat(Suffixes)) { foreach (var param in m.GetParameters()) { if (param.Name.StartsWith(LOCAL_PARAMETER)) { var requiredType = param.ParameterType.IsByRef ? param.ParameterType.GetElementType() : param.ParameterType; if (specialVariables.TryGetValue(param.Name, out var existingParam)) { if (existingParam.Type != requiredType) { throw new ArgumentException( $"Trying to use injected local {param.Name} for {m.DeclaringType?.FullName}#{m.ToString()} with type {requiredType} but a local with the same name already exists with type {existingParam.Type}", param.Name); } } else { specialVariables.Add(param.Name, declareLocal(requiredType, false)); } } } } foreach (MethodInfo prefix in Prefixes) { instructions.AddRange(EmitMonkeyCall(prefix, specialVariables)); if (prefix.ReturnType == typeof(bool)) { instructions.Add(new MsilInstruction(OpCodes.Brfalse).InlineTarget(labelSkipMethodContent)); } else if (prefix.ReturnType != typeof(void)) { throw new Exception( $"Prefixes must return void or bool. {prefix.DeclaringType?.FullName}.{prefix.Name} returns {prefix.ReturnType}"); } } instructions.AddRange(MethodTranspiler.Transpile(_method, (x) => declareLocal(x, false), Transpilers, labelAfterOriginalContent)); instructions.Add(new MsilInstruction(OpCodes.Nop).LabelWith(labelAfterOriginalContent)); if (resultVariable != null) { instructions.Add(new MsilInstruction(OpCodes.Stloc).InlineValue(resultVariable)); } var notSkip = new MsilLabel(); instructions.Add(new MsilInstruction(OpCodes.Br).InlineTarget(notSkip)); instructions.Add(new MsilInstruction(OpCodes.Nop).LabelWith(labelSkipMethodContent)); if (prefixSkippedVariable != null) { instructions.Add(new MsilInstruction(OpCodes.Ldc_I4_1)); instructions.Add(new MsilInstruction(OpCodes.Stloc).InlineValue(prefixSkippedVariable)); } instructions.Add(new MsilInstruction(OpCodes.Nop).LabelWith(notSkip)); foreach (MethodInfo suffix in Suffixes) { instructions.AddRange(EmitMonkeyCall(suffix, specialVariables)); if (suffix.ReturnType != typeof(void)) { throw new Exception($"Suffixes must return void. {suffix.DeclaringType?.FullName}.{suffix.Name} returns {suffix.ReturnType}"); } } if (resultVariable != null) { instructions.Add(new MsilInstruction(OpCodes.Ldloc).InlineValue(resultVariable)); } instructions.Add(new MsilInstruction(OpCodes.Ret)); var result = MethodTranspiler.Transpile(_method, instructions, (x) => declareLocal(x, false), PostTranspilers, null).ToList(); if (result.Last().OpCode != OpCodes.Ret) { result.Add(new MsilInstruction(OpCodes.Ret)); } return(result); }