private ProjectInfo GetProject(CakeScript cakeScript, string filePath)
        {
            var name = Path.GetFileName(filePath);

            if (!File.Exists(cakeScript.Host.AssemblyPath))
            {
                throw new FileNotFoundException($"Cake is not installed. Path {cakeScript.Host.AssemblyPath} does not exist.");
            }
            var hostObjectType = Type.GetType(cakeScript.Host.TypeName, a => _assemblyLoader.LoadFrom(cakeScript.Host.AssemblyPath, dontLockAssemblyOnDisk: true), null, false);

            if (hostObjectType == null)
            {
                throw new InvalidOperationException($"Could not get host object type: {cakeScript.Host.TypeName}.");
            }

            return(ProjectInfo.Create(
                       id: ProjectId.CreateNewId(Guid.NewGuid().ToString()),
                       version: VersionStamp.Create(),
                       name: name,
                       filePath: filePath,
                       assemblyName: $"{name}.dll",
                       language: LanguageNames.CSharp,
                       compilationOptions: cakeScript.Usings == null ? _compilationOptions.Value : _compilationOptions.Value.WithUsings(cakeScript.Usings),
                       parseOptions: new CSharpParseOptions(LanguageVersion.Default, DocumentationMode.Parse, SourceCodeKind.Script),
                       metadataReferences: GetMetadataReferences(cakeScript.References),
                       // TODO: projectReferences?
                       isSubmission: true,
                       hostObjectType: hostObjectType));
        }
Example #2
0
        public static void Serialize(BinaryWriter writer, CakeScript script)
        {
            if (writer == null)
            {
                throw new ArgumentNullException(nameof(writer));
            }
            if (script == null)
            {
                throw new ArgumentNullException(nameof(script));
            }

            // Type and Version
            writer.Write(Constants.CakeScript.TypeAndVersion);

            // Host object
            writer.WriteString(script.Host.TypeName);
            writer.WriteString(script.Host.AssemblyPath);

            // Source
            writer.WriteString(script.Source);

            // References
            writer.Write(script.References.Count);
            foreach (var reference in script.References)
            {
                writer.WriteString(reference);
            }

            // Usings
            writer.Write(script.Usings.Count);
            foreach (var @using in script.Usings)
            {
                writer.WriteString(@using);
            }
        }
Example #3
0
 // Start is called before the first frame update
 void Start()
 {
     distance_tow = Vector3.Distance(enemy.transform.position, target);
     ani          = GetComponent <Animator>();
     cakeObj      = GameObject.Find("cake");
     CakeSc       = cakeObj.GetComponent <CakeScript>();
     ResetTimer();
 }
Example #4
0
 // Start is called before the first frame update
 void Start()
 {
     WaveText         = GameObject.Find("WaveText").GetComponent <Text>();
     Restart          = GameObject.Find("Restart").GetComponent <Text>();
     WaveText.enabled = false;
     Restart.enabled  = false;
     cakeObj          = GameObject.Find("cake");
     CakeSc           = cakeObj.GetComponent <CakeScript>();
     enemyNum         = Mathf.Clamp(0, 0, 12);
     //startcoRutine("wait");
 }
Example #5
0
        public static void Serialize(BinaryWriter writer, CakeScript script, byte version)
        {
            if (writer == null)
            {
                throw new ArgumentNullException(nameof(writer));
            }
            if (script == null)
            {
                throw new ArgumentNullException(nameof(script));
            }
            if (version > Constants.Protocol.Latest)
            {
                throw new ArgumentOutOfRangeException(nameof(version));
            }

            // Type and Version
            writer.Write(Constants.CakeScript.WithVersion(version));

            // Host object
            writer.WriteString(script.Host.TypeName);
            writer.WriteString(script.Host.AssemblyPath);

            // Source
            if (version == Constants.Protocol.V2)
            {
                // V2 compress source
                var bytes = Zip(script.Source);
                writer.Write(bytes.Length);
                writer.Write(bytes);
            }
            else
            {
                // V1 source as string
                writer.Write(script.Source);
            }

            // References
            writer.Write(script.References.Count);
            foreach (var reference in script.References)
            {
                writer.WriteString(reference);
            }

            // Usings
            writer.Write(script.Usings.Count);
            foreach (var @using in script.Usings)
            {
                writer.WriteString(@using);
            }
        }
Example #6
0
            public void ShouldCallTheServer()
            {
                // Given
                var expected = new CakeScript {
                    Source = "Test"
                };

                _fixture.ServerCallback = change => expected;

                // When
                var actual = _fixture.Client.Generate(new FileChange());

                // Then
                Assert.Equal(expected.Source, actual.Source);
            }
Example #7
0
        public static CakeScript Deserialize(BinaryReader reader)
        {
            if (reader == null)
            {
                throw new ArgumentNullException(nameof(reader));
            }

            // TypeId and Version
            var typeAndVersion = reader.ReadInt16();

            if (typeAndVersion != Constants.CakeScript.TypeAndVersion)
            {
                throw new InvalidOperationException($"Unsupported type or version: {typeAndVersion}");
            }

            var cakeScript = new CakeScript();

            // Host object
            cakeScript.Host.TypeName     = reader.ReadString();
            cakeScript.Host.AssemblyPath = reader.ReadString();

            // Source
            var bytesLength = reader.ReadInt32();
            var bytes       = reader.ReadBytes(bytesLength);

            cakeScript.Source = Unzip(bytes);

            // References
            var referencesLength = reader.ReadInt32();

            for (var i = 0; i < referencesLength; i++)
            {
                cakeScript.References.Add(reader.ReadString());
            }

            // Usings
            var usingsLength = reader.ReadInt32();

            for (var i = 0; i < usingsLength; i++)
            {
                cakeScript.Usings.Add(reader.ReadString());
            }

            return(cakeScript);
        }
Example #8
0
        public CakeScript CreateCakeScript(string source, int referencesLength, int usingsLength)
        {
            var cakeScript = new CakeScript
            {
                Source = source
            };

            for (var i = 0; i < referencesLength; i++)
            {
                cakeScript.References.Add(Guid.NewGuid().ToString());
            }
            for (var i = 0; i < usingsLength; i++)
            {
                cakeScript.Usings.Add(Guid.NewGuid().ToString());
            }

            return(cakeScript);
        }
        private ProjectInfo GetProject(CakeScript cakeScript, string filePath)
        {
            var name = Path.GetFileName(filePath);

            if (!File.Exists(cakeScript.Host.AssemblyPath))
            {
                throw new FileNotFoundException($"Cake is not installed. Path {cakeScript.Host.AssemblyPath} does not exist.");
            }
            var hostObjectType = Type.GetType(cakeScript.Host.TypeName, a => _assemblyLoader.LoadFrom(cakeScript.Host.AssemblyPath, dontLockAssemblyOnDisk: true), null, false);

            if (hostObjectType == null)
            {
                throw new InvalidOperationException($"Could not get host object type: {cakeScript.Host.TypeName}.");
            }

            var projectId = ProjectId.CreateNewId(Guid.NewGuid().ToString());
            var analyzerConfigDocuments = _workspace.EditorConfigEnabled
                ? EditorConfigFinder
                                          .GetEditorConfigPaths(filePath)
                                          .Select(path =>
                                                  DocumentInfo.Create(
                                                      DocumentId.CreateNewId(projectId),
                                                      name: ".editorconfig",
                                                      loader: new FileTextLoader(path, Encoding.UTF8),
                                                      filePath: path))
                                          .ToImmutableArray()
                : ImmutableArray <DocumentInfo> .Empty;

            return(ProjectInfo.Create(
                       id: projectId,
                       version: VersionStamp.Create(),
                       name: name,
                       filePath: filePath,
                       assemblyName: $"{name}.dll",
                       language: LanguageNames.CSharp,
                       compilationOptions: cakeScript.Usings == null ? _compilationOptions.Value : _compilationOptions.Value.WithUsings(cakeScript.Usings),
                       parseOptions: new CSharpParseOptions(LanguageVersion.Latest, DocumentationMode.Parse, SourceCodeKind.Script),
                       metadataReferences: GetMetadataReferences(cakeScript.References),
                       // TODO: projectReferences?
                       isSubmission: true,
                       hostObjectType: hostObjectType)
                   .WithAnalyzerConfigDocuments(analyzerConfigDocuments));
        }
Example #10
0
        private ProjectInfo GetProject(CakeScript cakeScript, string filePath)
        {
            var name = Path.GetFileName(filePath);

            var assembly       = _assemblyLoader.LoadFrom(cakeScript.Host.AssemblyPath);
            var hostObjectType = Type.GetType(cakeScript.Host.TypeName, a => assembly, null, true);

            return(ProjectInfo.Create(
                       id: ProjectId.CreateNewId(Guid.NewGuid().ToString()),
                       version: VersionStamp.Create(),
                       name: name,
                       filePath: filePath,
                       assemblyName: $"{name}.dll",
                       language: LanguageNames.CSharp,
                       compilationOptions: cakeScript.Usings == null ? _compilationOptions.Value : _compilationOptions.Value.WithUsings(cakeScript.Usings),
                       parseOptions: new CSharpParseOptions(LanguageVersion.Default, DocumentationMode.Parse, SourceCodeKind.Script),
                       metadataReferences: cakeScript.References.Select(reference => MetadataReference.CreateFromFile(reference, documentation: GetDocumentationProvider(reference))),
                       // TODO: projectReferences?
                       isSubmission: true,
                       hostObjectType: hostObjectType));
        }
Example #11
0
        public CakeScript Generate(FileChange fileChange)
        {
            if (fileChange == null)
            {
                throw new ArgumentNullException(nameof(fileChange));
            }

            // Make the script path absolute.
            var scriptPath = new FilePath(fileChange.FileName).MakeAbsolute(_environment);

            // Prepare the file changes
            _log.Verbose("Handling file change...");
            HandleFileChange(scriptPath, fileChange);

            // Analyze the script file.
            _log.Verbose("Analyzing build script...");
            var result = _analyzer.Analyze(scriptPath);

            // Install addins.
            foreach (var addin in result.Addins)
            {
                try
                {
                    _log.Verbose("Installing addins...");
                    var addinReferences = _processor.InstallAddins(new[] { addin }, _addinRoot);
                    foreach (var addinReference in addinReferences)
                    {
                        result.References.Add(addinReference.FullPath);
                    }
                }
                catch (Exception e)
                {
                    // Log and continue if it fails
                    _log.Error(e);
                }
            }

            // Load all references.
            _log.Verbose("Adding references...");
            var references = new HashSet <FilePath>(_defaultReferences.Value);

            references.AddRange(result.References.Select(r => new FilePath(r)));

            // Find aliases
            _log.Verbose("Finding aliases...");
            var aliases = new List <CakeScriptAlias>();

            foreach (var reference in references)
            {
                if (_fileSystem.Exist(reference))
                {
                    aliases.AddRange(_aliasFinder.FindAliases(reference));
                }
            }

            // Import all namespaces.
            _log.Verbose("Importing namespaces...");
            var namespaces = new HashSet <string>(result.Namespaces, StringComparer.Ordinal);

            namespaces.AddRange(GetDefaultNamespaces());
            namespaces.AddRange(aliases.SelectMany(alias => alias.Namespaces));

            // Create the response.
            // ReSharper disable once UseObjectOrCollectionInitializer
            _log.Verbose("Creating response...");
            var response = new CakeScript();

            response.Host.TypeName     = _hostObject.TypeName;
            response.Host.AssemblyPath = _hostObject.AssemblyPath;
            response.Source            = string.Join("\n", result.Defines) +
                                         string.Join("\n", result.UsingAliases) +
                                         string.Join("\n", result.UsingStaticDirectives) +
                                         GenerateSource(aliases) +
                                         string.Join("\n", result.Lines);
            response.Usings.AddRange(namespaces);
            response.References.AddRange(references.Select(r => r.FullPath));

            // Return the response.
            return(response);
        }